数组转换成集合
-
可以使用
Arrays.asList()
方法。-
Integer[] a = {1,2,3,4}; List<Integer> list = Arrays.asList(a); System.out.println(list);
-
输出结果:,集合里存放的是单个的数字。
-
特别注意:这里数组不能使用
int[]
来定义,因为集合需要指定泛型,而泛型只能是引用类型,Arrays.asList()
方法返回的集合的泛型会和数组类型一致,但是如果数组类型是基本数据类型而不是引用类型,则会将整个数组int[]
当成泛型类型。此时集合里的元素就不再是单个的数字,而是整个整个的数组了:int[] a = {1,2,3,4}; List<int[]> list = Arrays.asList(a); System.out.println(list);
- 输出结果:,集合里存放的是数组。
-
-
-
Arrays.asList
方法返回一个List
,是一个视图,它的底层仍然是数组,因此不能使用add
,remove
方法,因为这会改变数组大小,只能使用访问底层数组的get
和修改数组元素的set
方法。-
修改方法
set()
:Integer[] a = {1,2,3,4}; List<Integer> list = Arrays.asList(a); System.out.println(list); list.set(0,111); System.out.println(list);
- 结果:
-
add()/remove()
方法:Integer[] a = {1,2,3,4}; List<Integer> list = Arrays.asList(a); list.add(1);//list.remove(1);
- 结果:
- 从源码分析:
- 这个方法返回的是一个
Arrays
的内部类java.util.Arrays$ArrayList
。这个内部类继承了AbstractList
,而AbstractList
又继承了List
。因此我们得用List
来接收这个结果,不能用ArrayList
!!! - 此时我们使用返回的
List
类型的集合并调用这个集合的方法,在运行的时候根据动态绑定机制会去运行类型java.util.Arrays$ArrayList
中调用这个方法,而java.util.Arrays$ArrayList
这个类是没有add()
和remove()
这两个方法的,因此我们调用会失败。
- 这个方法返回的是一个
- 额外:集合的
subList()
方法返回的视图没有操作限制,可以将任何增删改操作应用于这个视图,同时它会影响到原集合例如删除这个子视图相当于删除了元集合中的这些元素。
-
集合转换成数组
-
List集合的
toArray()
方法可以将集合转成对应类型的数组:ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(1); arrayList.add(2); arrayList.add(3); arrayList.add(5); Object[] objects1 = arrayList.toArray();//直接返回会返回一个Object类型的数组 Integer[] integers1 = arrayList.toArray(new Integer[0]);//添加这个参数即可,下面解释
- 如果直接调用
toArray()
将返回一个对象数组,此时由于数组的类型是不能强制转换的,即即使当前Obeject
数组中的元素都是Integer
类型也无法将它转换成Integer
类型的数组。 - 想要获得指定类型的数组必须在方法里new一个这种类型的数组,此时就会返回一个同类型的数组。参数中数组的长度小于集合大小会自动扩大到集合大小,长度大于集合大小多余的位置填
null
。 - 对返回的数组的操作不会影响到该集合:
- 如果直接调用
-
数组没有类型转换,即不能将int类型的数组转换成Object类型的数组。但是集合这样是可以的:
-
List<Integer> f = new ArrayList<>(); ArrayList<Integer> c = (ArrayList<Integer>)f;
-