说我有
HashMap<String, HashMap<String, Integer>> mapOfMaps = new HashMap<String, HashMap<String, Integer>>();
然后我将元素访问为
Integer foo = mapOfMaps.get('what').get('ever');
最后我更改foo
的值,例如:
foo++;
然后,如果我想在哈希图中看到该值的更新,我应该做些
HashMap<String, Integer> map = mapOfMaps.get('what');
然后将新值put
map.put('ever', foo);
这有效,如果我访问mapOfMaps.get('what').get('ever')
,我将获得更新的值。但是我的问题是:为什么我不必put
map
进入mapOfMaps
? (即:)
mapOfMaps.put('what', map);
答案 0 :(得分:1)
您的变量map
已经引用了HashMap
内部的同一mapOfMaps
对象。
HashMap mapOfMaps:
"what" -> (HashMap) <- map
"ever" -> (Integer) 1 <- foo
检索值foo
指的是存储在映射中的Integer
值,直到执行foo++
为止。因为Integer
是不可变的,所以foo++
真正要做的是将其拆箱,递增,然后再次将其装箱到另一个Integer
。现在foo
引用了另一个代表新值的Integer
对象。
HashMap mapOfMaps:
"what" -> (HashMap) <- map
"ever" -> (Integer) 1 foo -> 2
这说明了为什么需要将值2 put
返回到map
。
但是map
未被修改为引用另一个HashMap;它仍然引用与HashMap
中相同的mapOfMaps
。这意味着不需要put
重新回到mapOfMaps
,就像2
需要重新put
重新回到map
。