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

卢声远*_* Lu 0 java collections unmodifiable immutability 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));
Run Code Online (Sandbox Code Playgroud)

您对Immutable系列的理解是什么?谢谢!

Col*_*inD 21

你提到的没有什么是"缺陷".

a)ImmutableList根本不再是链表是无关紧要的.链表与基于数组的列表的唯一优点包括添加和删除元素(主要删除).您不能添加到不可变列表或从中删除,因此基于数组的快速随机访问以及内存效率更受欢迎.

对于类似的事情TreeSet,有很多要点需要考虑.

  1. 法线ImmutableSet保留了给定元素的迭代顺序.因此,如果您有一个TreeSet并且用于ImmutableSet.copyOf创建不可变副本,则复制的元素将按原始顺序排序.
  2. ImmutableSortedSet是不可变的等价物,TreeSet并使用元素的自然顺序或Comparator就像TreeSet它一样.

b)你可以List在不使用Guava的情况下创建一个不可变的事实并没有改变任何东西.Guava的不可变集合是专门针对不变性而设计的,因此具有各种优势,包括(但不限于):

  • 正如我在回答你的上一个问题时提到的那样,他们的不变性在类型层面得到了保证.当您的方法返回某种类型时ImmutableSet,调用者知道该集不能更改它们.如果它只是返回则不是这样Set.
  • 内存优化,包括空案例的单例和1元素案例的特殊类.
  • ImmutableSet.copyOf 如果输入已经是相同类型的不可变实例,则实际上不会复制任何内容.
  • 方法/构建器使您可以轻松创建不可变集合.