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

san*_*re6 9 java collections hashmap

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

Bhe*_*ung 10

使用单个API调用无法实现此功能,您需要利用深度克隆.更改原始文件时,不会更改克隆.此主题之前已在SO上讨论过,请参阅如何克隆ArrayList并克隆其内容?深度克隆实用程序推荐.


Bal*_*man 8

Google系列Immutable Map可能对您有所帮助.

看到Collections.unmodifiableMap

  • 如果修改了原始支持映射(例如,通过put),则ImmutableMap副本将不会反映新的更改.(如果K代表一种可变类型,那么你已经做了一件非常糟糕的事情.) (3认同)
  • 请注意,此答案链接到"google-collections"项目,该项目在两年多前就被放弃了.请参阅http://guava-libraries.googlecode.com (3认同)
  • 然而,这并未说明*包含*对象的可变性. (2认同)
  • @JustinMuller我不相信它的解释是正确的.它没有提到"K"的不变性(在Java中可以实现的唯一方法是添加K类型对象的复制/克隆).它认为它与`unmodifiableMap`不同 - 它将抛出`put`的例外 - 但*如果*原始*(支持)Map被修改,*仍将*通过`keys`显示新键(例如); 文档使它听起来像**差异. (2认同)