首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 重複使用 Map 變數加入 List:為何不需要 map1/map2/map3

     編輯:程式設計疑難解答

程式碼片段

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);
// ...

原理解析

  1. 引用語意:list.add(map) 將 Map 物件的引用 加入 List。此時 List 持有該 Map 物件的參考。
  2. 重新 new 切換引用:map = new HashMap<>() 讓區域變數 map 指向新的 Map 物件,原本加入 List 的第一個 Map 物件不受影響,仍保留在堆積區並被 List 參考。
  3. 記憶體效率:同一時刻只有一個 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 提示。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved