2012-11-01 67 views
0

在下面的鍵/值列表中,對於不同的鍵重複「val3」。哪種地圖最適合這種類型的列表。要使用哪個地圖/集合?

我想「val3」應該只存儲一次,多個鍵指向它。

KEY1 ----> VAL1
KEY2 ----> VAL3
KEY3 ----> VAL3
KEY5 ----> val5
鍵6 ----> VAL3
KEY7 ----> VAL6
key8 ----> VAL3
key9 ----> VAL3

+1

什麼*確切*你的意思是「只存儲一次」? –

+0

「val3」不應該在每個鍵的內存中重複 – Vasant

+0

完整的對象,或只是參考?這就是我正在尋找「完全」。我假設你理解Java中的引用和對象是如何工作的,並且映射只包含*引用*,而不是實際的對象? –

回答

2

任何Map執行就行了。每個Java集合都只保存引用,而不是實際的對象,所以如果你在地圖中多次放置同一個對象,所有的值都會指向同一個對象。換句話說,通過val3key2查找所做的更改將在通過指向val3的任何其他密鑰查找時反映出來。

考慮簡單的例子:

VeryLarge v = new VeryLarge(); 
Map<Integer, VeryLarge> map = new HashMap<>(); 
map.put(1, v); 
map.put(2, v); 
map.put(3, v); 

VeryLarge實例由所有123鍵引用。

+0

@thomasz String s1 = new String(「str1」)和String s2 = new String(「str1」)如何實現這個?值是相同的但不同的實例! – Vasant

+0

@Vasant:'s1 =「str1」; s2 =「str1」' - 現在它們相等,另請參閱:http://nurkiewicz.blogspot.no/2012/07/string-memory-internals.html –

1

只要你確保你不通過clone操作得到的值或者不不變對象(除String文字或Integer.valueOf()(值從-128到127緩存和返回從緩存中回)這是例外),你最終會得到多個指向相同引用的鍵。

因此,您可以使用HashMap作爲@Tomasz Nurkiewicz的建議。