理解错误的 Arrays.asList()

简介

Arrays.asList() 作用是将一个数组转换为一个List 集合。

String[] myArray = { "Apple", "Banana", "Orange" }; 
List<String> myList = Arrays.asList(myArray);
//上面两个语句等价于下面一条语句
List<String> myList = Arrays.asList("Apple","Banana", "Orange");

JDK 对这个源码的说明

/**
 * 返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与           
* Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。
*/ public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }

Arrays.asList() 将数组转换为集合后,底层还是数组。

阿里Java开发手册的描述:

 使用的数组必须是对象数组,而不是基本类型。

int[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());//1
System.out.println(myList.get(0));//数组地址值
System.out.println(myList.get(1));//报错:ArrayIndexOutOfBoundsException
int [] array=(int[]) myList.get(0);
System.out.println(array[0]);//1

当传入一个原生数据类型数组时,Arrays.asList() 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组,这也就解释了上面的代码。

 我们使用包装类型数组就可以解决这个问题。

Integer[] myArray = { 1, 2, 3 };

使用集合的修改方法:add()remove()clear()会抛出异常。

List myList = Arrays.asList(1, 2, 3);
myList.add(4);//运行时报错:UnsupportedOperationException
myList.remove(1);//运行时报错:UnsupportedOperationException
myList.clear();//运行时报错:UnsupportedOperationException

Arrays.asList() 方法返回的并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。

List myList = Arrays.asList(1, 2, 3);
System.out.println(myList.getClass());//class java.util.Arrays$ArrayList

参考:https://mp.weixin.qq.com/s/9ld5tYerNmE0KJwPSUn2oA

原文地址:https://www.cnblogs.com/bytecodebuffer/p/11379753.html