2013-02-01 86 views
0

我有一個包含多個鍵/值對的Java地圖。Java是否有純粹功能不可變的Map實現?

我想使用其他鍵/值對創建此映射的版本,但不會丟失舊版本。

簡單的解決方案是複製舊的Map,然後添加額外的鍵/值對,但我知道有不可變的Map算法可以更高效地實現這一點。

任何人都可以指出我可以在香草Java(即不是Clojure或Scala庫)中使用這樣的實現嗎?

+4

我不明白如何從可變映射構建不可變映射,而不將可變映射中的條目複製到不可變映射。 –

+0

您可以創建Map的修改副本,而不像Properties包含其他屬性文件。這隻適用於非常特殊的情況,在這種情況下,您可以對非常大的地圖進行少量修改。 –

+0

在標準包裝中看起來不像;有一個[copy-on-write-_ArrayList_](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)。你可以在網上某處找到實現... –

回答

0

難道你只是調用Map.putAll(Map other)嗎?我會假設JVM有效地實現了這一點。

0

您可以使用java.util.Properties,使用默認值功能。

0

認識到無論使用什麼方法,它都不會比通過oldMap迭代並將新條目放置在良好實施的newMap中更「高效」。 O(n)有一個下界時間和空間來複制n項目,不管你使用什麼類。不過,我仍然建議使用下面的方法之一來構建地圖,因爲它們的語法更簡單,更具慣用性,並且不太可能犯錯。

如果您只需要oldMap不變,您就有很多選擇。 java.util中的標準實現具有符合法案的構造函數。

Map<K, V> newMap = new HashMap<>(oldMap); 
newMap.put(otherKey, otherValue); 

如果您想要一個不可變的地圖,請使用com.google.common.collect.ImmutableMap

Map<K, V> newMap = ImmutableMap.<K, V>builder() 
    .putAll(oldMap) 
    .put(otherKey, otherValue) 
    .build(); 

我全熱烈贊同使用ImmutableMapImmutableListImmutableSet在適當的時候。不變性是一個非常有用的保證,這些類是精心設計的。

相關問題