Arrays.asList() 方法不理解就使用还是有很多坑的。比如,它返回的是自己内部类的 java.util.Arrays.ArrayList
- "阉割版"的List。不可进行Add/Remove。
- 更要注意的是:
如果我们在这里针对集合修改了某处元素值,那么原来数组的内容也会相应改变!即通过Arrays.asList()方法,得到的集合与原数组就已经关联起来,反之,如果我们修改了数组内容,那么集合获取到的内容也会随之改变。
可知道,构造ArrayList只是做了个对象引用的复制。而不是重新copy一份原来的对象。
- 用对象和基本类型构建是不一样的。如:
public static boolean testInteger (Integer num) {
Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6};
boolean flag = Arrays.asList(nums).contains(num);
return flag;
}
public static boolean testInt (int num) {
int[] nums = new int[]{1, 2, 3, 4, 5, 6};
boolean flag = Arrays.asList(nums).contains(num);
return flag;
}
前一个返回true,后一个返回false。
int[] nums = new int[] { 1, 2, 3, 4, 5, 6 };
List<int[]> list = Arrays.asList(nums);// 本质上把 T 泛型就是 int[] 数组类型。所以 返回 List<T> 而不是 List<Integer>
boolean flag = Arrays.asList(nums).contains(num);
Integer[] nums1 = new Integer[] { 1, 2, 3, 4, 5, 6 };
List<Integer> list2 = Arrays.asList(nums1); // T 泛型 就是 Integer 所以返回的就是 List<Integer>。
List<Integer[]> list3 = Arrays.asList(nums1,nums1); // T 泛型 就是 Integer[] 所以返回的就是 List<Integer[]>。
boolean flag2 = Arrays.asList(nums).contains(num);
从这里可以看出 两者之间的区别:
我们输出下 list的集合的大小。 System.out.println(list.size()); 输出的是:1 因为:泛型的类型参数只能是类类型(包括自定义类),不能是基本类型! 所以这里其实就已经有分歧了,所以这里我们相当于传入了一个对象,对象类型为数组类型,可变参数的长度是1, 而不是6。此时list相当于一个二维数组,在上面的情况中,即list数组的元素类型为数组,元素个数为1,而不是上面的Integer,此时集合为List<int[]>。
- Arrays.asList() 返回 size = 1 的空集合的情况。
Person person = null; List<Person> list = Arrays.asList(person); System.out.println(list.size());
输出 size = 1;循环的时候很容易 报错 null。 这里 泛型 T.. a 等价于 Person[] array = { null };