首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrays.asList()怀疑?

Arrays.asList()怀疑?
EN

Stack Overflow用户
提问于 2011-01-25 18:09:10
回答 8查看 16.7K关注 0票数 17

人们说asList方法将数组转换成list,并且它不会复制,所以'aList‘中的每一个变化都会反映为'a’。因此在'aList‘中添加新值是非法,因为数组具有固定的大小。

但是,asList()方法返回ArrayList<T>。编译器如何区分第3行和第5行。第3行给了我一个异常(UnsupportedOperationException)。

代码语言:javascript
复制
        String[] a = {"a","b","c","d"};//1
        List<String> aList =  Arrays.asList(a);//2
        aList.add("e");//3
        List<String> b = new ArrayList<String>();//4
        b.add("a");//5
EN

回答 8

Stack Overflow用户

发布于 2011-01-25 18:12:23

您从Arrays.asList收到的这个列表实现是数组上的一个特殊视图--您不能更改它的大小。

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

票数 35
EN

Stack Overflow用户

发布于 2011-01-25 18:16:27

Read again,Arrays.asList类型为:

代码语言:javascript
复制
public static <T> List<T> asList(T... a)

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

接下来,请注意List.add上的文档是这样写的:

布尔加法(E e)

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

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

票数 10
EN

Stack Overflow用户

发布于 2012-01-05 15:37:55

马诺杰

Arrays.List的返回类型是List接口的一些未知的内部实现,并且不是 java.util.ArrayList,所以您只能将其赋给List类型。

例如,如果你将它赋值给一个列表,它会给出编译时错误“类型不匹配:无法从List转换为ArrayList”。

代码语言:javascript
复制
  ArrayList<String> aList =  Arrays.asList(a);// gives Compile time error

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

IMO Arrays.asList的内部实现具有所有实现的方法,可以将数组的大小更改为-

代码语言:javascript
复制
void add(E e)
{
//some unknown code
throw(java.lang.UnsupportedOperationException);
}

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

不过,如果您想使用这样的语法向ArrayList添加一些新项,可以通过创建ArrayList的子类来实现(最好使用ArrayList的匿名子类)。您可以将Arrays.List的返回类型传递给ArrayList的构造函数(即。公共ArrayList(集合c))类似这样的东西-

代码语言:javascript
复制
List<String> girlFriends = new java.util.ArrayList<String>(Arrays.asList("Rose", "Leena", "Kim", "Tina"));
girlFriends.add("Sarah");

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

PS -请选择这个或另一个作为你的答案,因为每件事都已经解释过了。你的低录取率是非常令人沮丧的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4792160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档