问题的发现
用 Arrays.asList 方法转化一 int 型数组为 List 类型
| 12
 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 的源码
| 12
 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[] >>
| 12
 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 属于对象,因此能被泛型,可以达到预期的效果。
| 12
 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的缺陷