在下面的鍵/值列表中,對於不同的鍵重複「val3」。哪種地圖最適合這種類型的列表。要使用哪個地圖/集合?
我想「val3」應該只存儲一次,多個鍵指向它。
KEY1 ----> VAL1
KEY2 ----> VAL3
KEY3 ----> VAL3
KEY5 ----> val5
鍵6 ----> VAL3
KEY7 ----> VAL6
key8 ----> VAL3
key9 ----> VAL3
在下面的鍵/值列表中,對於不同的鍵重複「val3」。哪種地圖最適合這種類型的列表。要使用哪個地圖/集合?
我想「val3」應該只存儲一次,多個鍵指向它。
KEY1 ----> VAL1
KEY2 ----> VAL3
KEY3 ----> VAL3
KEY5 ----> val5
鍵6 ----> VAL3
KEY7 ----> VAL6
key8 ----> VAL3
key9 ----> VAL3
任何Map
執行就行了。每個Java集合都只保存引用,而不是實際的對象,所以如果你在地圖中多次放置同一個對象,所有的值都會指向同一個對象。換句話說,通過val3
到key2
查找所做的更改將在通過指向val3
的任何其他密鑰查找時反映出來。
考慮簡單的例子:
VeryLarge v = new VeryLarge();
Map<Integer, VeryLarge> map = new HashMap<>();
map.put(1, v);
map.put(2, v);
map.put(3, v);
單VeryLarge
實例由所有1
,2
和3
鍵引用。
@thomasz String s1 = new String(「str1」)和String s2 = new String(「str1」)如何實現這個?值是相同的但不同的實例! – Vasant
@Vasant:'s1 =「str1」; s2 =「str1」' - 現在它們相等,另請參閱:http://nurkiewicz.blogspot.no/2012/07/string-memory-internals.html –
只要你確保你不通過clone
操作得到的值或者不不變對象(除String
文字或Integer.valueOf()
(值從-128到127緩存和返回從緩存中回)這是例外),你最終會得到多個指向相同引用的鍵。
因此,您可以使用HashMap
作爲@Tomasz Nurkiewicz的建議。
什麼*確切*你的意思是「只存儲一次」? –
「val3」不應該在每個鍵的內存中重複 – Vasant
完整的對象,或只是參考?這就是我正在尋找「完全」。我假設你理解Java中的引用和對象是如何工作的,並且映射只包含*引用*,而不是實際的對象? –