Lambda表达式七:补充:数组;ArrayList(List);Arrays;Array(待补充);
本篇博客主要介绍的是Arrays类(Arrays类的主要目的是操作数组);
目录
1.数组:
2.ArrayList(List):
3.Arrays类:主要目的是方便操作数组
(1)Arrays类简介
(2)Arrays.asList()使用指南(本篇博客的核心!!!)
● java.util.Arrays.asList() 的一般用法
● java.util.Arrays.asList() 在使用中极易出错的地方
错误点1:将原生类型的数组作为参数,而且List定义的时候没有使用泛型
错误点2:试图修改List的大小
错误点3:不再使用Arrays.asList()方法;而是自编代码完成数组转为List的操作
4.Array类:(待补充)
1.数组:

数组属于Java的引用数据类型;
数组用来存储固定大小的、同类型的元素;
内存中连续存储的数组结构能够方便地进行随机访问。如果内存中的数据不以连续块形式存储的话,则会影响其随机访问性能。这种性能的影响将导致读取速度显著下降。
了解集合与数组之间的差异,请参考《Java集合一:概述》这篇文章。
2.ArrayList(List):
ArrayList底层是由数组实现的;

AList在Java中被定义为一种动态大小的容器结构;而A数组一旦被创建其长度就固定下来不能再更改了;AList支持通过调用add()方法来插入元素。
在使用ArrayList集合时,请注意以下事项:打印的是内容值而非地址值;如果内容为空,则打印结果为[]

在ArrayList中常用的几种操作包括add()用于插入元素、get()用于访问元素、remove()用于移除元素以及size()用于获取元素数量信息。
此外,在使用ArrayList时,其参数化类型仅限于引用类型的实现;若使用基本数据类型,则需要相应的包装类。
3.Arrays类:主要目的是方便操作数组
(1)Arrays类简介

……………………………………………………
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:
- 将数组赋值为:使用 fill() 方法执行赋值操作。
- 对该数组进行排序:调用 sort() 方法,并按升序排列其元素。
- 比较两个数组中的元素值:可以通过 equals() 方法来判断两组数据是否存在完全相同的数值集合。
- 查找特定的数值:使用 binarySearch() 方法可以在已排序的数组中快速定位特定数值的位置。
具体说明请查看下表:
| 序号 | 方法和说明 |
|---|
| 1| public static int binarySearch(Object[] a, Object key)
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。 |
| 2| public static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此 相等 ,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
| 3| public static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
| 4| public static void sort(Object[] a)
对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
本部分参考自:Java 数组;
……………………………………………………
(2)Arrays.asList()使用指南(本篇博客的核心!!!)
● java.util.Arrays.asList() 的一般用法
List 是一种功能强大的数据结构。如果要将数组转换为 List 以便进行更丰富的操作的话,请参考以下具体实现方法。
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = Arrays.asList(myArray);
另外一种选择:(这种方法我也常用) 这两种方法,在使用列表时必须明确写出其具体类型!! 这一点至关重要!!(虽然有一定的局限性, 但也能有效避免错误的发生!!)
List<String> myList = Arrays.asList("Apple", "Orange");
上面这两种形式都是极为常见的:以待转换的数组作为参数使用的方法有两种:一种是直接将该数组传递给函数或方法;另一种则是逐个提取数组中的元素并传递给函数或方法。
● java.util.Arrays.asList() 在使用中极易出错的地方
错误点1: 将原生类型的数组作为参数,而且List定义的时候没有使用泛型

原因分析:

请确认:参数类型为 T ,依据官方文档的相关说明可知,T 代表数组元素所属的 class 类型。对于熟悉反射技术的朋友来说,请明确 class 的概念应该是显而易见的。任意类型的对象都具备 class 属性这一事实是不容置疑的。如 int、short、long 这样的基本数据类型不具备 class 属性,请注意区分其与包装类 Integer、Short 等的区别。具有 class 属性的是它们所对应的包装类 Integer、Short、Long 等等(注:此处应包含具体实例)。因此,在使用 asList 方法时必须确保传入的对象或对象数组才能正常工作——如果传入的是原始数据类型而非包装类数组,则会导致 List 实际接收的对象仅为整个数组本身!这正是为什么要引入包装类的原因之一——它们能够更好地支持对象操作功能并提供必要的属性支持(注:此处应包含具体示例)。当传入一个由原始数据类型组成的数组时(asList 方法会收到这样的参数),则 List 实际接收的对象仅为整个输入数组本身!这正是为何必须确保传入参数为对象或对象数组的根本原因(注:此处应包含具体示例)。因此,在实际应用中应当避免将原始数据类型作为asList方法的输入参数——这将导致 List 结构无法正确解析输入中的单个元素信息!
PS:我的感觉:
(1) Arrays.asList()的参数需要是对象类型;(而不能是诸如int,float这些非对象数据类型);(对象类型是java中的类、接口、数组这些引用数据类型和包装类)
(2) Arrays.asList()的参数是可变参数;可变参数的本质就是一个数组;Arrays.asList()的参数可以传入一个数组如:

也可以传入非数组的参数:(当时Arrays.asList(1,2,3,4); 背后有自动装箱啦);

所以,在当数组类型为int时的情形下
解决办法1:使用包装类:

解决办法2:List定义的时候,加上泛型,强制检查类型


……………………………………………………
错误点2: 试图修改List的大小
该列表具有动态扩展的能力:当生成一个空列表时,默认情况下最常见的操作包括追加新项以及移除现有项。


当我运行这段代码时,遇到了一个 java.lang.UnsupportedOperationException 异常。这个错误提示显示,在列表对象myList中添加新项是不允许的;同样地,在试图从myList中删除项时也会触发相同的错误。那么原因何在呢?请参考官方文档中的相关内容。其中一段描述指出:
返回一个由指定数组生成的固定大小 的 List。

So,Why?这背后的原理又是什么?如何能确保定长?

我可以去AbstractList类中进行考察:可以看出该add方法会触发"UnsupportedOperationException"异常;


基于AbstractList类实现了功能:进一步查看由Arrays提供的ArrayList实例。并未覆盖从其父类AbstractList中继承而来的add和remove方法;因此,在对通过Arrays获得的ArrayList执行add或remove操作时会触发不可支持的操作异常(UnsupportedOperationException);
那么为什么我们平常定义的ArrayList可以add或者remove?



……………………………………………………
错误点3: 弃用Arrays.asList()方法,而是自己编写方法 实现数组到List的转换
即,这条的意思,尽量不要自己造轮子。
通常情况下, 自己实现的方法相较于使用库中的方法更为高效. 由于 asList 方法存在一定的局限性, 我们可以通过建立高效的数组到 List 转换机制来完成这一功能.

这么操作看起来是可以实现目标的;然而其存在明显的缺陷:代码量较大,并且实际上等同于自行设计一个框架(reinventing the wheel)。当然而言;无论有哪些需求;自行解决总是有其合理性;毕竟动手做总归是有好处的。例如说;如果需要将数组中的每一个元素复制到List中两次:

通常情况下,在解决同一个问题时可能会有多种解决方案。为了提高效率起见,常用的方法是利用现有的工具或框架来解决问题。如果没有任何限制,则探索其他可能的解决方案是一个可行的选择。
本部分参考自:Arrays.asList使用指南;
4.Array类:(待补充)

这儿等用到了再补充吧。
