如何从java HashMap获取不可变集合?

时间:2012-01-28 05:46:15

标签: java collections hashmap

我需要从java HashMap获取一个集合,而不会在以后的集合中反映地图中的更改。我想使用Collection.toArray()来实现这一点,但它不起作用。结果Object []也在改变(javadocs说返回的数组将是“安全的”,因为这个集合没有维护对它的引用)。有没有简单的方法来实现这个目标?

5 个答案:

答案 0 :(得分:9)

使用单个API调用无法实现此功能,您需要利用深度克隆。更改原始文件时,不会更改克隆。此主题之前已经讨论过,请参阅How to clone ArrayList and also clone its contents?Deep clone utility recomendation

答案 1 :(得分:8)

答案 2 :(得分:2)

您可以创建不可修改的Map

答案 3 :(得分:2)

以下内容仍然有效并描述了观察到的问题(请参阅执行何种副本的位)。但是,我不会就 执行深层复制提供任何答案。

相反,我的建议,是将对象设计为immutable,这完全避免了这个问题。根据我的经验,这对于大多数琐碎的对象(即不是“容器”的对象)非常有效,并且可以简化代码和推理。


来自HashMap.values的Javadoc:

  

返回此地图中包含的值的Collection视图。 该集合由地图支持,因此对地图的更改会反映在集合中,反之亦然......

创建它的副本也许是有益的吗?

HashMap<K,V> map = ....;
List<V> values = new ArrayList<V>(map.values());

实质上,它执行“{3}}”,即“现在是独立的”。但是,浅层副本,不会执行所包含对象的克隆/复制。 (如果需要shallow-copy语义,请参阅答案:问题本身在这个问题上看起来有点模糊。)

快乐编码

答案 4 :(得分:0)

创建原始地图的HashMap.clone()的浅表副本,然后从中检索值收集。这将在clone()调用时创建对原始地图中对象的新引用;显然,包含的对象内部的更改仍将反映在复制的集合中。如果您想要这种行为,唯一的办法就是在所需的集合中硬拷贝地图对象。