程式碼片段
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("img", R.drawable.moto);
map.put("name", "摩托羅拉");
list.add(map);
map = new HashMap<>(); // 重新 new
map.put("img", R.drawable.iphone);
map.put("name", "iPhone");
list.add(map);
// ...
原理解析
- 引用語意:
list.add(map) 將 Map 物件的引用 加入 List。此時 List 持有該 Map 物件的參考。
- 重新 new 切換引用:
map = new HashMap<>() 讓區域變數 map 指向新的 Map 物件,原本加入 List 的第一個 Map 物件不受影響,仍保留在堆積區並被 List 參考。
- 記憶體效率:同一時刻只有一個
map 變數佔用棧空間,三個 Map 物件分別佔用堆積空間,無額外變數開銷。
對比:使用 map1/map2/map3
Map m1 = new HashMap(); m1.put(...); list.add(m1);
Map m2 = new HashMap(); m2.put(...); list.add(m2);
Map m3 = new HashMap(); m3.put(...); list.add(m3);
- 功能完全相同,但多佔用 2 個棧槽位(
m2, m3),編譯後位元碼略大,可讀性未必更好。
- 若後續需單獨操作某個 Map(如修改第 2 筆資料),則需保留對應變數引用;單純加入 List 並不需要。
最佳實踐
- 區域變數重複使用 減少視覺雜訊,符合「就近宣告、單一職責」原則。
- 若 Map 結構固定,考慮定義
DataClass 或 Record (Java 16+) 替代 Map,獲得型別安全與 IDE 提示。