在 Servlet 中查詢資料庫,將每筆記錄封裝為 Menu 物件加入 List<Menu>,再存入 Session。但取出時發現 List 長度正確,所有元素卻都是最後一筆資料(如「秘制雞排 20.0」重複 6 次)。後台列印也同樣全為最後一筆。
private Menu menu = new Menu(); // 類成員變量,只 new 一次
// ...
while (rs.next()) {
menu.setName(rs.getString("m_name"));
menu.setPrice(Float.parseFloat(rs.getString("m_price")));
menu.setPic(rs.getString("m_pic"));
list.add(menu); // 每次 add 的是同一個 menu 實例
}
menu 宣告為類成員變數,整個迴圈只有一個 Menu 實例。每次迴圈只是修改該實例的屬性值,然後將同一個引用重複加入 List。List 內部儲存的是引用地址,因此所有索引最終指向同一個物件,顯示的自然是最後一次賦值的結果。
在迴圈內部每次 new 新物件:
while (rs.next()) {
Menu menu = new Menu(); // 每筆資料對應一個獨立實例
menu.setName(rs.getString("m_name"));
menu.setPrice(Float.parseFloat(rs.getString("m_price")));
menu.setPic(rs.getString("m_pic"));
list.add(menu);
}

圖中 elementData 陣列每個槽位透過「=」指向同一個 Menu 物件地址,修改物件內容會影響所有槽位。
new HashMap<>()。