【问题标题】:What is the relationship between Collections and ImmutableCollectionsCollections 和 ImmutableCollections 有什么关系
【发布时间】:2020-08-16 07:31:44
【问题描述】:

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

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

List<String> list = new ArrayList();

然而,在

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

,List.of()method 返回 ImmutableCollections.List12
我从未听说过 Collection 层次结构中的那个类,我发现它没有实现 List 接口(那么它是如何转换为 List 的?)

另外,我觉得我不能通过 ImmutalbeList 来制作很奇怪

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

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

【问题讨论】:

  • List12 扩展 AbstractImmutableList 实现 List
  • 实际实施细节有所不同。也考虑查看源代码
  • 如果这是出于好奇:很好。但是,一般来说,文档说List.of 返回一个List,这就是您应该关心的全部。它返回的具体类型是一个实现细节。
  • Java 标准库没有不可变的集合接口。一切都是可变的。不可变集合通过更新add()throwingUnsupportedOperationException等方法实现。

标签: java collections immutability


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    }

    如果我们应用 concat 方法,这不会改变对象的状态,只会返回“hello”。但是,如果我们将结果初始化为一个新变量,那么它将具有像这样的适当结果

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

    }

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-28
      • 2013-07-02
      • 2017-02-06
      • 2022-01-03
      • 2020-03-05
      • 2012-09-27
      • 2020-04-17
      • 2016-03-21
      相关资源
      最近更新 更多