Tag: 不可修改

不可变的番石榴collections品的缺陷?

我不确定我理解的不可变集合的缺陷是否正确,所以我在这个答案中列出它们。 希望有人在这里纠正我。 a):与Collections.unmodifiableXXX()相比,ImmutableXXX.copyOf() 丢失了源集合function 。 例如,当将linkedList放入ImmutableList.copyOf()时,不再链接ImmutableList。 与基于树的集合相同。 b):人们认为Collections.unmodifiableXXX只使用相同的源集合引用,因此一旦源集合发生更改,Collections.unmodifiableXXX也会更改。 但我的解决方案是将源集合包装到临时集合中,该集合传递给ImmutableXXX.copyOf()。 见下面的代码: List l = new ArrayList(); List unmodifiableList = Collections.unmodifiableList(l); ImmutableList 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 unmodifiableList2= Collections.unmodifiableList(new ArrayList(l)); 您对Immutable系列的理解是什么? 谢谢!

hashCode和equals for Collections.unmodifiableCollection()

Collections类有许多静态辅助方法来提供各种集合类型的只读视图,例如unmodifiableSet() , unmodifiableList()等。对于这些视图对象, hashCode()和equals()方法将调用转发给底层集合……有一个奇怪的例外: unmodifiableCollection() 。 JavaDoc 明确指出 : 返回的集合不会将hashCode和equals操作传递给后台集合,而是依赖于Object的equals和hashCode方法。 在后备集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。 我的问题:wtf是这个在谈论? 如果后备集合是一个集合或列表,我希望行为与unmodifiableSet()和unmodifiableList() 。 怎么会违反hashCode / equals合同?

如何创建深度不可修改的集合?

在从getter方法返回之前,我经常使集合字段不可修改: private List _xs; …. List getXs(){ return Collections.unmodifiableList(_xs); } 但是,如果上面的X本身就是一个List,我想不出一个方便的方法: private List<List> _yLists; ….. List<List> getYLists() { return Collections.unmodifiableList(_yLists); } 上面的问题当然是虽然客户端无法修改列表列表,但它可以从嵌入列表中添加/删除Y对象。 有什么想法吗?

返回不可修改的地图

使用Collections.unmodifiableMap(…) ,我试图返回一个不可修改的地图视图。 假设我有以下方法, public final Map getMap(){ … return Collections.unmodifiableMap(map); } 为什么在其他地方执行以下操作是合法的, Map map = getMap(); map.put(…); 这不会像我想的那样抛出UnsupportedOperationException 。 有人可以解释一下,或者建议我如何成功地返回真正无法修改的地图?

java集合的不可修改的包装器是否使它们对线程安全?

我需要使ArrayLists的ArrayList线程安全。 我也无法让客户对集合进行更改。 不可修改的包装器是否会使线程安全?或者我需要在集合上使用两个包装器吗?

Java不可修改的数组

final Integer[] arr={1,2,3}; arr[0]=3; System.out.println(Arrays.toString(arr)); 我尝试了上面的代码,看看是否可以重新分配最终数组的变量[ ans :它可以]。我理解通过最终的Integer []数组,这意味着我们不能分配另一个Integer []的实例,而不是我们拥有的那个最初分配。我想知道是否有可能使数组变量也不可修改。