卢声远*_* 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,有很多要点需要考虑.
ImmutableSet保留了给定元素的迭代顺序.因此,如果您有一个TreeSet并且用于ImmutableSet.copyOf创建不可变副本,则复制的元素将按原始顺序排序.ImmutableSortedSet是不可变的等价物,TreeSet并使用元素的自然顺序或Comparator就像TreeSet它一样.b)你可以List在不使用Guava的情况下创建一个不可变的事实并没有改变任何东西.Guava的不可变集合是专门针对不变性而设计的,因此具有各种优势,包括(但不限于):
ImmutableSet,调用者知道该集不能更改它们.如果它只是返回则不是这样Set.ImmutableSet.copyOf 如果输入已经是相同类型的不可变实例,则实际上不会复制任何内容.| 归档时间: |
|
| 查看次数: |
3052 次 |
| 最近记录: |