当前位置: 首页 > 面试题库 >

Java不可变集合

柳刚豪
2023-03-14
问题内容

从Java 1.6 Collection
Framework文档中

不支持任何修改操作(如类别addremoveclear)被称为 不可修改的
。[…]额外保证Collection对象中的任何更改都将不可见的Collection被称为 不可变的

第二个标准使我有些困惑。鉴于第一个集合是不可修改的,并且假定原始集合引用已被删除,那么第二行中提到的更改是什么?它是指集合中包含的元素的变化,即元素的状态吗?

第二个问题:
要使集合不可变,如何提供指定的其他保证人?如果集合中元素的状态由线程更新,那么对于不可变是否足以使状态中的那些更新在保存不可变集合的线程上不可见?

对于一个不可变的集合,如何提供指定的附加保证?


问题答案:

不可修改的集合通常是其他集合的只读视图(包装器)。您不能添加,删除或清除它们,但是基础集合可以更改。

不可变集合完全不能更改-它们不包装另一个集合-它们具有自己的元素。

这是番石榴的报价
ImmutableList

Collections.unmodifiableList(java.util.List<? extends T>),它是仍然可以更改的单独集合的视图不同,的实例ImmutableList包含其自己的私有数据,并且永远不会更改。

因此,基本上,为了从可变的集合中获取不可变的集合,您必须将其元素复制到新集合中,并禁止所有操作。



 类似资料:
  • 问题内容: 我指的是Apple的Swift编程指南,以了解如何用Swift语言创建可变/不可变对象(数组,字典,集合,数据)。但是我不明白如何在Swift中创建一个不可变的集合。 我希望在Objective-C中看到以下Swift中的等效项 不变数组 可变数组 不变字典 可变字典 问题答案: 创建不可变数组 第一种方式: 第二种方式: 创建可变数组 将对象追加到数组 辞典 创建不可变字典 创建可变

  • 问题内容: 我真的很喜欢Java 8流和Guava的不可变集合,但是我不知道如何将两者一起使用。 例如,如何实现将流结果收集到ImmutableMultimap中的Java 8 Collector? 优点:我希望能够提供键/值映射器,类似于Collectors.toMap()的工作方式。 问题答案: 从21版开始,您可以

  • Java 9 版本以前,假如要创建一个包含 6 个元素的 Set 集合,程序需要先创建 Set 集合,然后调用 6 次 add() 方法向 Set 集合中添加元素。Java 9 对此进行了简化,程序直接调用 Set、List、Map 的 of() 方法即可创建包含 N 个元素的不可变集合,这样一行代码就可创建包含 N 个元素的集合。 不可变意味着程序不能向集合中添加元素,也不能从集合中删除元素。

  • 不可变集合是不可被修改的, 集合的数据项是在创建的时候提供, 并且在整个生命周期中都不可改变. Immutable对象有以下的优点: 对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象 线程安全的:immutable对象在多线程下安全,没有竞态条件 不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis

  • 我非常喜欢Java8流和Guava的不可变集合,但我不知道如何将两者结合使用。 例如,如何实现将流结果收集到不可变多映射中的Java 8收集器? 奖励点:我希望能够提供键/值映射器,类似于Collectors.toMap()的工作方式。

  • 我想做以下事情: 但在某种程度上,结果列表是Guava的<code>ImmutableList<code>的实现。 我知道我可以做到 但我想直接收集它。我试过了 但它抛出了一个异常: java.lang.UnsupportedOperationException at com.google.common.collect.ImmutableCollection.add(ImmutableCollec