2011-07-27 33 views
8

這可能是一個蹩腳的問題。在Java Map <Integer,Double []>中,獲取和修改後是否需要放置Double []?

在下面的代碼:

Map<Integer, Double[]> dataMap = new Map<Integer, Double[]>(); 
dataMap.put(1, new Double[]{100,100}); 
Double[] dob = dataMap.get(1); 
dob[0] = 100; 
dob[1] = 200; 
dataMap.put(1, dob); 

是必要的最後一個 「dataMap.put」 指令?或者將dataMap.get(1)產生一個對數組的引用,然後在後面的語句中直接修改它。我知道,在可變對象(例如Map)的情況下,Map.get()會給我所需對象的引用,但是帶有一個雙精度數組(其元素類型如Double是不可變的),我我不確定是否在Map中獲得對數組的引用。

謝謝!

回答

17

不,最後的聲明不是必須的 - 因爲地圖只包含對數組的引用,正如你所提到的。數組是一個可變對象,即使Double不是 - 它就像擁有一個帶有setName(String)方法的對象 - 僅僅因爲String是不可變的,容器類型不是。

請注意,如果你這樣做,另一個線程可以看到一半的變化(即第一個元素100的設置),沒有看到設置爲200。第二個因素是,好嗎?如果沒有,你會考慮創建一個新數組改爲:

Map<Integer, Double[]> dataMap = new HashMap<Integer, Double[]>(); 
dataMap.put(1, new Double[]{100,100}); 
// Other stuff... 

// Replace value in map with a reference to a different array. 
Double[] dob = new Double[] { 100, 200 }; 
dataMap.put(1, dob); 

這是假設您使用的是線程安全的地圖開始,當然...

+0

很好的答案,謝謝你的多線程技巧。 – obaqueiro

1

Double本身是不可變的,但就數組而言,這是無關緊要的。

把每個Double想象成一個堅不可摧的盒子。儘管箱子是堅不可摧的,但就您的庫存而言,您仍然可以將它們丟棄並替換爲其他物品。

相關問題