我需要从java HashMap获取一个集合,而不会在以后的集合中反映地图中的更改。我想使用Collection.toArray()来实现这一点,但它不起作用。结果Object []也在改变(javadocs说返回的数组将是“安全的”,因为这个集合没有维护对它的引用)。有没有简单的方法来实现这个目标?
答案 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()
调用时创建对原始地图中对象的新引用;显然,包含的对象内部的更改仍将反映在复制的集合中。如果您想要这种行为,唯一的办法就是在所需的集合中硬拷贝地图对象。