Arrays.asList()有疑问吗?

人们说asList方法将数组转换为列表而不是复制,因此’aList’中的每个更改都会反映为’a’。 因此,在’aList’中添加新值是非法的,因为数组具有固定大小。

但是, asList()方法返回ArrayList 。 编译器如何将第3行与5区分开来。第3行给出了exception( UnsupportedOperationException )。

  String[] a = {"a","b","c","d"};//1 List aList = Arrays.asList(a);//2 aList.add("e");//3 List b = new ArrayList();//4 b.add("a");//5 

Arrays.asList收到的这个List实现是数组的特殊视图 – 你不能改变它的大小。

Arrays.asList()的返回类型是java.util.Arrays.ArrayList ,它经常与java.util.ArrayList混淆。 Arrays.ArrayList只是将数组显示为列表

再读一遍 ,Arrays.asList的类型是:

 public static  List asList(T... a) 

这清楚地表明asList返回一个实现接口java.util.List的对象,它没有说它将返回类java.util.ArrayList的实例。

接下来,请注意List.add上的文档说:

布尔加法(E e)

将指定的元素追加到此列表的末尾(可选操作)

从技术上讲,每次使用类型为List(而不是ArrayList)的变量时,都应该始终注意这个方法可能会抛出UnsupportedOperationException 。 如果您确定只接收一个始终具有正确语义的.add()的List实现,那么当您的假设失效时,您可以省略检查以防止出现错误。

马诺,

Arrays.List的Return类型是List接口的一些未知内部实现,而不是 java.util.ArrayList,因此您只能将它分配给List类型。

例如,如果将它分配给ArrayList,它将为您提供编译时错误“类型不匹配:无法从List转换为ArrayList”

  ArrayList aList = Arrays.asList(a);// gives Compile time error 

来自Javadoc “Arrays.asList”返回由指定数组支持的固定大小列表。(对返回列表的更改“直写”到数组。)“这意味着您只提供了IMO的列表视图是在运行时创建的,当然你不能改变数组的大小,所以你也不能改变“Arrays.asList”的大小。

IMO Arrays.asList的内部实现具有所有可以改变数组大小的实现方法 –

 void add(E e) { //some unknown code throw(java.lang.UnsupportedOperationException); } 

因此,每当您尝试更改Array的大小时,它都会抛出UnsupportedOperationException。

如果您想通过使用这样的语法将一些新项添加到ArrayList,您可以通过创建Arraylist的子类(最好使用ArrayList的匿名子类)来实现。 你可以将Arrays.List的返回类型传递给ArrayList的构造函数(即.public ArrayList(Collection c))这样的东西 –

 List girlFriends = new java.util.ArrayList(Arrays.asList("Rose", "Leena", "Kim", "Tina")); girlFriends.add("Sarah"); 

现在,您可以使用相同的语法轻松地将Sarah添加到GF列表中。

PS – 请选择这一个或另一个作为您的答案,因为已经解释了evrything。 您的低接受率非常令人沮丧。

asList()不返回java.util.ArrayList ,它返回java.util.Arrays$ArrayList 。 这个类甚至不扩展java.util.ArrayList ,因此它的行为可以(并且是)完全不同。

add()方法inheritance自java.util.AbstractList ,默认情况下只抛出UnsupportedOperationException

您假设Arrays.asList()返回一个ArrayList ,但事实并非如此。 Arrays.asList()返回未指定的List实现。 该实现只会在每个不受支持的方法上抛出UnsupportedOperationException

这是一个例外而不是编译器错误。 它在程序运行时抛出,而不是在编译时抛出。 基本上Arrays.asList将返回的实际类在add()方法中throw UnsupporteOperationException

更具体的说, Arrays.asList将返回在Arrays类中定义的内部类,该类是从AbstractList派生的,并且不实现add方法。 AbstractListadd方法实际上是抛出exception。

关键是返回的List实现

 List aList = Arrays.asList(a); 

如果查看Arrays中的源代码,您将看到它包含一个内部私有静态类ArrayList 。 这与java.util.ArrayList

asList返回固定大小的列表,因此您无法向其添加新元素。 因为它返回的列表实际上是从(在你的情况下是’a’)创建的数组的“视图”,所以你将无法添加元素是有道理的 – 就像你不能添加元素一样数组。 请参阅asList的文档