使用java中Arrays.asList方法的注意事项

Arrays.asList方法可以将数组转化为List,但在使用过程中需要注意一些问题。

1.发现问题

首先看一个示例:

输出结果有个奇怪的地方,就是第三个例子,这个整型数组明明有5个值,但用Arrays.asList后,大小仅为1。调试一下,看一看这个list的内容:

发现它把整个数组当做成一个值放入了list中。

接下来尝试用其他类型:

到这里,猜想是基本类型都会这样,只有包装类型符合预期效果。

2.查看源码

点进去看asList方法:

1
2
3
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}

首先它是一个静态方法,ArrayList也明显不是常用的那个ArrayList,其实到这就已经出答案了,基本类型不可以泛型化。然而下一行就是这个ArrayList的定义方法,顺眼看一下:

1
2
3
4
5
6
7
8
9
10
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;

ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
......

final修饰符说明了当new出这个ArrayList的时候,已经不可以修改了。

再看看它的父类AbstractList,里面有add方法:

1
2
3
4
5
6
7
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}

显然,在调用add的时候,直接就会抛出异常:

3.小结

  • 基本类型数组不能用Arrays.asList
  • 用Arrays.asList生成的list不支持修改

那么,回到开始的示例,怎么把整型的基本类型数组转化为list呢?for遍历?当然可以,还可以这样:

1
List<Integer> list = Arrays.stream(intArray).boxed().collect(Collectors.toList()); //jdk8以上