Map map = new HashMap();
Map ma = map; // ma 與 map 指向同一物件
for (int i = 0; i < 3; i++) {
Map map2 = new HashMap<>();
map2.put("sss", "呵呵");
ma.put(i, map2); // 向「同一個」map 放入 map2
ma = map2; // ma 指向新 map2,下一輪迴圈操作的是新 map2
}
System.out.println(map); // 輸出嵌套結構:{0={...}, 1={...}, 2={...}}
迴圈前:
map ──────► HashMap@100 (空)
ma ──────► HashMap@100 (同一個)
i=0:
map2 ───► HashMap@200 {"sss":"呵呵"}
ma.put(0, map2) → HashMap@100 變為 {0: HashMap@200}
ma = map2 → ma 現在指向 HashMap@200
i=1:
map2 ───► HashMap@300 {"sss":"呵呵"}
ma.put(1, map2) → HashMap@200 變為 {1: HashMap@300} (注意!操作的是上一輪的 map2)
ma = map2 → ma 指向 HashMap@300
i=2:
map2 ───► HashMap@400 {"sss":"呵呵"}
ma.put(2, map2) → HashMap@300 變為 {2: HashMap@400}
ma = map2 → ma 指向 HashMap@400
最終 map (HashMap@100) 結構:
{
0 → HashMap@200 { 1 → HashMap@300 { 2 → HashMap@400 {"sss":"呵呵"} } }
}
「沒有直接操作 map,為什麼 map 變了?」
因為 `ma = map` 只是複製引用 (指標),兩個變數指向同一個堆上物件。後續 `ma = map2` 只是讓 `ma` 變數指向新物件,但首輪迴圈 `ma.put(0, map2)` 已修改了原始 `map` 的內容。隨後迴圈操作的是鏈式嵌套的 `map2` 物件,最終形成鏈式結構掛在原始 `map` 下。
new HashMap<>(oldMap) (淺拷貝) 或深拷貝工具。
Map> map = new HashMap<>();
for (int i = 0; i < 3; i++) {
Map map2 = new HashMap<>();
map2.put("sss", "呵呵");
map.put(i, map2); // 每次都放入同一個外層 map,鍵不同
}
// 結果: {0={sss=呵呵}, 1={sss=呵呵}, 2={sss=呵呵}}