Java Arrays.asList 转化 int 数组为 List

问题的发现

用 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));
/* output:
int array
1
[I@16b98e56
*/
}
}

如果按照一般的思维,转化后的 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));
/* output:
3
1
2
3
*/
}
}

既然知道了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));
/* output:
3
1
2
3
*/
}
}

相对来讲这种方法跟满足预期要求。

参考

  1. Stack Overflow Arrays.asList() not working as it should?
  2. Java提高篇(三六)—–Java集合细节(二):asList的缺陷
LICENSED UNDER CC BY-NC-SA 4.0