说我有
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);
最佳答案
您的变量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
未被修改为引用另一个HashMap;它仍然引用与map
中相同的HashMap
。这意味着它不必像重新将mapOfMaps
重新回到put
一样,又可以将mapOfMaps
重新回到2
。