关于不可变列表(由 Arrays.asList() 创建)

2022-09-01 10:42:01

当我们使用 从数组创建列表时,该列表是不可变的。我只是好奇为什么我们要创建一个不可变的列表,当(或或)的基本目的是具有动态大小并能够随意添加,删除元素时。当我们需要一个固定大小的数据结构时,我们选择 Array,当我们需要一个动态数据结构时,我们会选择 or or 等。那么,拥有不可变列表的目的是什么呢?我在完成任务时遇到了这个问题。java.util.Arrays.asList()ListSetMapListSetMap


答案 1

当我们使用java.util.Arrays.asList()从数组创建列表时,列表是可变的。

是和否:可以通过调用

list.set(index, element);

但该列表可能不会结构上进行修改。这意味着无法向列表中添加元素或从列表中删除元素。原因很简单,列表仍然由数组支持,数组的大小可能不会改变。

当我们需要一个固定大小的可变集合时,我们会选择 Array

这就是这里的关键点:数组不是集合。该方法主要充当“数组世界”和“集合世界”之间的“桥梁”。Arrays.asList

例如,该方法允许您将数据传递给需要:Arrays.asListCollection

// A method that expects a collection:
void process(List<String> strings) { ... }

void call()
{
    String array[] = new String[] { "A", "B", "C" };

    // Pass the array (as a list) to the method:
    process(Arrays.asList(array));
}

此应用程序案例包括从数组创建其他集合。例如,如果您有一个数组,并且想要创建一个包含该数组中的元素的数组,则可以Set

String array[] = new String[] { "A", "B", "C" };
Set<String> set = new HashSet<String>();
for (String s : array) 
{
    set.add(s);
}

但是使用该方法,这可以更方便地完成:Arrays.asList

Set<String> set = new HashSet<String>(Arrays.asList(array));

该方法可以说是Collection#toArray方法的对应物,其工作方向相反(尽管此方法通常涉及创建和填充数组,而该方法只是“包装”数组并让它“看起来像”一个)。Arrays.asListArrays.asListList


答案 2

java.util.Arrays.asList()调用,但此 ArrayList 是数组的私有类,它扩展并覆盖某些实现。因此,期望 的行为是不公平的。如果你仔细观察,你会发现你可以调用add(E e),但不能调用很多其他方法。因此,根据当前实现,您可以在列表底部添加元素,但不能更改列表的现有结构。return new ArrayList<>(a);AbstractListjava.util.ArrayListjava.util.AbstractList