繁体   English   中英

番石榴一成不变的收藏品的缺陷?

[英]Defects of Immutable collections of Guava?

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

a):与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) ImmutableList不再是链表完全无关紧要。 与基于数组的列表相比,链表的唯一优点包括添加和删除元素(主要是删除)。 您不能在不可变列表中添加或删除,因此基于数组的数组由于其快速的随机访问以及内存效率而更可取。

对于诸如TreeSet东西,要考虑一些要点。

  1. 普通的ImmutableSet保留其给定元素的迭代顺序。 因此,如果您有一个TreeSet并使用ImmutableSet.copyOf创建一个不可变的副本,则复制的元素的顺序将与原始元素相同。
  2. ImmutableSortedSetTreeSet的不变TreeSet并且像TreeSet一样使用元素或Comparator的自然顺序。

b)您无需使用Guava即可创建一个不可变的List的事实不会改变任何事情。 番石榴的不可变的集合与心灵永恒性设计,他们因为各种优点,包括(但不限于):

  • 正如我在对上一个问题的回答中所提到的,它们在类型级别上的不变性得到了保证。 当您的方法返回类型为ImmutableSet东西时,调用者知道该集合无法更改。 如果它只返回Set ,则不是这样。
  • 内存优化,包括针对空情况的单例和针对1元素情况的特殊类。
  • 如果输入已经是相同类型的不可变实例,则ImmutableSet.copyOf等实际上不复制任何内容。
  • 易于创建不可变集合的方法/构建器。

为什么我们需要不可变的收藏

  • 它极大地简化了并发编程。 想一想,为什么编写适当的多线程编程很难? 因为很难同步线程对给定资源(在这种情况下为列表)的访问。

ColinD和Amir直接回答了您的特定问题,但您可能还想看看GTUG-使用Java Java馆藏库(2之1) -Kevin Bourrillion(Guava的首席开发人员)关于不可变馆藏的演示,他在其中解释了所有内容不可变集合的优点。

该演示文稿已有两年历史了,并且侧重于“ Google Collections”(现在是Guava的一部分),这是一个非常有趣的演示文稿。 自发布以来,该API可能已发生了一些变化,因为当时Google Collections API处于Beta版,但大多数概念保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM