我有一個包含多個鍵/值對的Java地圖。Java是否有純粹功能不可變的Map實現?
我想使用其他鍵/值對創建此映射的版本,但不會丟失舊版本。
簡單的解決方案是複製舊的Map,然後添加額外的鍵/值對,但我知道有不可變的Map算法可以更高效地實現這一點。
任何人都可以指出我可以在香草Java(即不是Clojure或Scala庫)中使用這樣的實現嗎?
我有一個包含多個鍵/值對的Java地圖。Java是否有純粹功能不可變的Map實現?
我想使用其他鍵/值對創建此映射的版本,但不會丟失舊版本。
簡單的解決方案是複製舊的Map,然後添加額外的鍵/值對,但我知道有不可變的Map算法可以更高效地實現這一點。
任何人都可以指出我可以在香草Java(即不是Clojure或Scala庫)中使用這樣的實現嗎?
難道你只是調用Map.putAll(Map other)嗎?我會假設JVM有效地實現了這一點。
您可以使用java.util.Properties,使用默認值功能。
認識到無論使用什麼方法,它都不會比通過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();
我全熱烈贊同使用ImmutableMap
,ImmutableList
和ImmutableSet
在適當的時候。不變性是一個非常有用的保證,這些類是精心設計的。
我不明白如何從可變映射構建不可變映射,而不將可變映射中的條目複製到不可變映射。 –
您可以創建Map的修改副本,而不像Properties包含其他屬性文件。這隻適用於非常特殊的情況,在這種情況下,您可以對非常大的地圖進行少量修改。 –
在標準包裝中看起來不像;有一個[copy-on-write-_ArrayList_](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)。你可以在網上某處找到實現... –