Java 不可变集合

2022-08-31 08:40:31

来自 Java 1.6 集合框架文档

不支持任何修改操作(如 、和 )的集合称为不可修改的集合。[...]另外保证 Collection 对象中的任何更改都不可见的集合称为不可变。addremoveclear

第二个标准让我有点困惑。鉴于第一个集合是不可修改的,并且假设原始集合引用已被丢弃,那么第二行中提到的更改是什么?它是否是指集合中保存的元素的变化,即元素的状态?

第二个问题:
为了使集合不可变,如何提供指定的附加保证书?如果集合中某个元素的状态由线程更新,那么处于该状态的这些更新在保存不可变集合的线程上不可见是否足以实现不可变性?

为了使集合不可变,如何提供指定的其他保证?


答案 1

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

不可变集合根本无法更改 - 它们不会包装另一个集合 - 它们有自己的元素。

这是来自番石榴的不可变列表的引用

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

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


答案 2

不同之处在于,不能引用允许更改的不可变集合。不可修改的集合无法通过该引用进行修改,但其他一些对象可能指向可以更改它的相同数据。

例如:

List<String> strings = new ArrayList<String>();
List<String> unmodifiable = Collections.unmodifiableList(strings);
unmodifiable.add("New string"); // will fail at runtime
strings.add("Aha!"); // will succeed
System.out.println(unmodifiable);