为什么诸如List / Map / Set.of...或Arrays.asList...之类的方法返回不可变的列表?

问题描述

返回不可变列表而不是可变列表的原因是什么?

解决方法

性能

以下是Oracle JDK 9 Documentation的摘录:

为获得最佳性能,不可变集合存储数据集 永远不会改变。但是,您可能可以利用 性能和节省空间的好处,即使您的数据受制于 更改。这些集合可能会提供比 可变的集合,即使您的数据偶尔更改也是如此。

List#of是静态工厂方法,提供了便捷的方式来创建不可变列表。换句话说,这是创建不可变列表的便捷方法。在Java-9之前,可以通过诸如Collections#unmodifiableList之类的单独API来实现。

如果要获取可变列表,可以使用此不可变列表作为参数实例化ArrayList

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> mutableList = new ArrayList<>(List.of("A","B","C"));
        mutableList.add("D");
        System.out.println(mutableList);
    }
}

输出:

[A,B,C,D]