说我有

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

10-04 10:41