这两种初始化方式有什么区别:
List<String> list = new ArrayList<String>(Arrays.asList(arr));
和
List<String> list = Arrays.asList(arr);
我能说的一件事是,在后一种情况下,我们没有使用ArrayList
类。但是,我们在这里创建了哪个类的对象(列表)?
答案 0 :(得分:8)
第一个创建一个可变List
,第二个是固定大小。 ArrayList
不是List
的唯一实现。 Arrays.asList
返回其自身的固定大小的实现,即可以更新单个元素,但不能添加或删除元素。
答案 1 :(得分:2)
我看到的唯一区别是第二个会创建一个不可变的List
对象。
答案 2 :(得分:1)
在List<String> list = Arrays.asList(arr);
Arrays.asList(arr)
返回由arr
String类型数组支持的固定大小列表。它没有实现添加或删除方法(正如规范中所说的是固定大小列表)。
所以,如果你想添加类似这样的东西
list.add("StackOverflow")
您将收到 UnsupportedOperationException(抛出以指示不支持所请求的操作。),因为返回的列表具有修复大小。
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html
在List<String> list = new ArrayList<String>(Arrays.asList(arr));
new ArrayList<String>(Arrays.asList(arr))
返回一个列表,其中包含由arr
String类型数组支持的固定大小列表的元素,按照集合迭代器返回的顺序返回。
所以,如果您尝试添加类似这样的内容
list.add("StackOverflow")
然后会添加差异。
答案 3 :(得分:0)
对于第一个将列表 arr 传递给返回List的静态方法 asList ,然后创建一个新的ArrayList,并将该方法的结果作为a构造函数参数。
对于第二个,您直接使用静态方法的结果作为对象。