Java 番石榴不可变集合的缺陷?

Java 番石榴不可变集合的缺陷?,java,collections,immutability,guava,unmodifiable,Java,Collections,Immutability,Guava,Unmodifiable,我不确定我所理解的不可变集合的缺陷是否正确,所以我在这个答案中列出了它们。希望有人在这里纠正我 答:与Collections.unmodifiableXXX相比,ImmutableXXX.copyOf将丢失源集合功能。例如,当linkedList被放入ImmutableList.copyOf中时,ImmutableList不再链接。与基于树的集合相同 b:人们认为Collections.unmodifiableXXX只是使用了源集合的相同引用,所以一旦源集合被更改,Collections.unm

我不确定我所理解的不可变集合的缺陷是否正确,所以我在这个答案中列出了它们。希望有人在这里纠正我

答:与Collections.unmodifiableXXX相比,ImmutableXXX.copyOf将丢失源集合功能。例如,当linkedList被放入ImmutableList.copyOf中时,ImmutableList不再链接。与基于树的集合相同

b:人们认为Collections.unmodifiableXXX只是使用了源集合的相同引用,所以一旦源集合被更改,Collections.unmodifiableXXX也会被更改。但我的解决方案是将一个源集合包装成一个临时集合,该集合被传递到ImmutableXXX.copyOf。见下面的代码:

List<String> l = new ArrayList<String>();
List<String>  unmodifiableList = Collections.unmodifiableList(l);
ImmutableList<String> immutableList= ImmutableList.copyOf(l);
l.add("a");//unmodifiableList is also added "a", immutableList not.

/*My solution as follows:
So unmodifiableList2 is also immutable as ImmutableList.copyOf(l) does*/
List<String> unmodifiableList2= Collections.unmodifiableList(new ArrayList(l));
你对不可变集合的理解是什么?谢谢

为什么我们需要不可变的集合

它极大地简化了并发编程。认为 关于它,为什么编写适当的多线程编程很难?因为 很难同步线程对给定资源的访问—在本例中为列表。
你提到的都不是缺点

a不可变列表不再是链表并不重要。与基于数组的列表相比,链表的唯一优点是添加和删除元素。您无法向不可变列表中添加或从中删除,因此基于数组的方法更适合于快速随机访问和内存效率

<> P.TeSESET之类的东西,有很多要点要考虑。 普通的ImmutableSet保留给定元素的迭代顺序。因此,如果您有一个树集并使用ImmutableSet.copyOf创建一个不可变副本,那么复制的元素的顺序将与原始元素中的相同。 ImmutableSortedSet是TreeSet的不可变等价物,与TreeSet一样,它使用元素的自然顺序或比较器。 b不使用番石榴就可以创建一个恰好不可变的列表,这一事实不会改变任何事情。番石榴的不变性系列是专为不变性设计的,因此它们具有各种优势,包括但不限于:

正如我在回答上一个问题时提到的,它们的不变性在类型级别上是有保证的。当您的方法返回ImmutableSet类型的内容时,调用方知道集合不能在它们上更改。如果它只是返回Set,则情况并非如此。 内存优化,包括空案例的单例和1元素案例的特殊类。 ImmutableSet.copyOf等。如果输入已经是同一类型的不可变实例,则不实际复制任何内容。 方法/生成器,使创建不可变集合变得容易。
ColinD和Amir直接回答了您的具体问题,但您可能还想看看Kevin Bourrillion Guava的首席开发人员关于不可变集合的演示,他在演示中解释了不可变集合的所有优点


虽然这篇演讲已经有两年的历史了,重点是Google Collections,它现在是番石榴的一个子部分,但这是一篇非常有趣的演讲。该API自发布以来可能发生了一些变化,因为Google Collections API当时处于测试阶段,但大多数概念保持不变。

。非常感谢。