Collections 和 ImmutableCollections 有什么关系

What is the relationship between Collections and ImmutableCollections

我正在学习Java Collections FrameWork。
我无法理解集合的层次结构。

由于ArrayList实现了List接口,我们可以使用

List<String> list = new ArrayList();

然而,在

List<String> names = List.of("Larry", "Kenny", "Sabrina");

,List.of()方法returnsImmutableCollections.List12
我从未听说过 Collection 层次结构中的 class,我发现它没有实现 List 接口(那么它是如何转换为 List 的?)

此外,我觉得很奇怪我不能通过

制作ImmutalbeList
List<String> names = new ImmutableList("Larry", "Kenny", "Sabrina");

我对 Kotlin 知之甚少,可变和不可变之间存在层次结构。但是我在 Java.
中找不到它们之间的任何联系 这里发生了什么?

不可变集合与普通集合相同,但创建后不能修改(即它是只读的)。您无法添加、删除或更新项目,如果您尝试抛出 unsupportetOperationException.
您不能通过 new ImmutableList() 实例化 ImmutableList,因为它是抽象的 class。您可以使用 ImmutableList.of() 方法获取 immuatabel 列表。
如果您想了解有关 immutableList 的更多信息,请参阅 Geeksforgeeks - ImmutableList in java

为了彻底分析为什么会发生这种情况,让我们从不变性的定义开始:

'如果对象在构造后其状态不能改变,则该对象被认为是不可变的。最大限度地依赖不可变对象已被广泛接受为创建简单、可靠代码的合理策略。

当我们查看 Java 中众所周知的 classes 之一时,我们也可以确认我们无法更改状态。去字符串 class.

public class Main {
public static void main(String[] args) {
    String hello = "hello";
    hello.concat("world");
    System.out.println(hello);
}

}

如果我们应用 concat 方法,这不会改变对象状态,只会 return“你好”。但是,如果我们将结果初始化为一个新变量,那么它就会得到像这样的适当结果

public class Main {
public static void main(String[] args) {
    String hello = "hello";
    String newHello = hello.concat("world");
    System.out.println(newHello);
}

}

问题是 concat 方法在骗我。它说它会连接一些东西,但实际上并没有,因为字符串是不可变的。因此,由于不可变对象无法更改其状态,因此我们也不应该拥有更改其状态的方法。

由于我们不能为不可变类型使用这些方法,而且我们不能只实现接口的一部分,我们需要创建另一个接口,该接口只包含可以从列表中读取但不更改状态的方法像 List.add() 这样的对象。