Contents

arrays.aslist和new ArrayList的区别

1. 概述

在这个简短的教程中,我们将了解*Arrays.asList(array)ArrayList(Arrays.asList(array))*之间的区别。

2. Arrays.asList

让我们从Arrays.asList 方法开始。

使用这种方法,我们可以将数组转换为固定大小的List对象。这个List只是一个使数组作为列表可用的包装器。没有数据被复制或创建

此外,我们不能修改它的长度,因为不允许添加或删除元素

但是,我们可以修改数组中的单个项目。请注意,我们对List的单个项目所做的所有修改都将反映在我们的原始数组中

String[] stringArray = new String[] { "A", "B", "C", "D" };
List stringList = Arrays.asList(stringArray);

现在,让我们看看如果我们修改stringList的第一个元素会发生什么:

stringList.set(0, "E");
 
assertThat(stringList).containsExactly("E", "B", "C", "D");
assertThat(stringArray).containsExactly("E", "B", "C", "D");

正如我们所见,我们的原始数组也被修改了。列表和数组现在都以相同的顺序包含完全相同的元素。 现在让我们尝试在stringList中插入一个新元素:

stringList.add("F");
java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)

正如我们所见,在List中添加/删除元素会抛出java.lang.UnsupportedOperationException。**

3. ArrayList(Arrays.asList(array))

Arrays.asList方法类似,当我们需要从数组中创建 List 时,我们可以使用ArrayList<>(Arrays.asList(array))

但是,与我们之前的示例不同,这是数组的独立副本,这意味着修改新列表不会影响原始数组。此外,我们拥有常规ArrayList的所有功能,例如添加和删除元素:

String[] stringArray = new String[] { "A", "B", "C", "D" }; 
List stringList = new ArrayList<>(Arrays.asList(stringArray));

现在让我们修改stringList的第一个元素:

stringList.set(0, "E");

assertThat(stringList).containsExactly("E", "B", "C", "D");

现在,让我们看看我们的原始数组发生了什么:

assertThat(stringArray).containsExactly("A", "B", "C", "D");

如我们所见,我们的原始数组保持不变

在结束之前,如果我们看一下 JDK 源代码 ,我们可以看到Arrays.asList方法返回一个与java.util.ArrayList 不同的*ArrayList 类型。主要区别在于返回的ArrayList仅包装现有数组——它不实现addremove*方法。