问题的发现
用 Arrays.asList 方法转化一 int 型数组为 List 类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import java.util.Arrays; import java.util.List;
public class Test { public static void main(String[] args) { int arr[] = new int[]{1, 2, 3}; List list = Arrays.asList(arr);
System.out.println("int array"); System.out.println(list.size()); list.forEach(x -> System.out.println(x));
} }
|
如果按照一般的思维,转化后的 list 应该含有三个元素{1, 2, 3},所以 size 自然也应该是3。但从实践来看,并不是如此。
原因解释
首先查看 Arrays.asList 的源码
1 2 3
| public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
|
可以发现该方法传入的参数是一个可变长的参数。而问题的关键在于泛型。在 JAVA 中,基本数据类型是不能被泛型的。基本数据类型,即 primitive type,包含 8 种,具体可查看 Link 。
支持泛型的只能是对象。int 是基本数据类型,不能被泛型。而 int[] 是数组,数组在 JAVA 中属于对象,因此能被泛型。所以在最开始的代码中,list 仅包含一个元素,而这个元素即为 包含了 {1, 2, 3} 的数组。
解决方法
声明 List 类型为 List<< int[] >>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.util.Arrays; import java.util.List;
public class Test { public static void main(String[] args) { int arr[] = new int[]{1, 2, 3}; List<int[]> list1 = Arrays.asList(arr); System.out.println(list1.get(0).length); Arrays.stream(list1.get(0)).forEach(x -> System.out.println(x));
} }
|
既然知道了list中仅有的元素是一个数组,那么只能将计就计,从列表取出是要多一个心眼,知道拿出的是数组。
将数组声明为 Integer 对象数组
Integer 属于对象,因此能被泛型,可以达到预期的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import java.util.Arrays; import java.util.List;
public class Test { public static void main(String[] args) { Integer arrIN[] = new Integer[]{1, 2, 3}; list = Arrays.asList(arrIN); System.out.println("Integer array"); System.out.println(list.size()); list.forEach(x -> System.out.println(x));
} }
|
相对来讲这种方法跟满足预期要求。
参考
- Stack Overflow Arrays.asList() not working as it should?
- Java提高篇(三六)—–Java集合细节(二):asList的缺陷