[英]Mystery with ArrayList<Object> in a HashMap
我只是在運行下面的代碼,我對結果感到驚訝。 有人可以解釋一下這里發生了什么嗎? My question is.. when I set a value using an object setter into a new copy of original arraylist, why is the object value in the original arrayList also getting changed?
如果我在這里做錯了什么,請告訴我。
public class TestHashMap {
public static void main(String[] args) {
HashMap<String, ArrayList<ResultData>> hmData = new HashMap<String, ArrayList<ResultData>>();
ArrayList<ResultData> arrData = new ArrayList<ResultData>();
for (int i = 0; i < 10; i++) {
ResultData rData = new ResultData();
rData.setDy(i + 1);
arrData.add(rData);
}
hmData.put("test",arrData);
System.out.println("Before >>>> "+hmData.get("test").get(1).getDy());
ArrayList<ResultData> newList = new ArrayList<ResultData>();
newList = hmData.get("test");
ResultData rNew = newList.get(1);
rNew.setDy(1234566);
System.out.println("##### >>>>> "+arrData.get(1).getDy());
System.out.println("After >>>> "+hmData.get("test").get(1).getDy());
}}
原因:您指的是相同的舊 object,帶有新的引用。 (存儲在 hmData 中)。 因此,在 object 級別,它們都引用相同的 Object memory 位置在堆中,這就是為什么更改一個值會反映在另一個值中。
更多說明:假設 arrData 存儲在“A”Memory 位置。 當您針對 key = "test" 獲取值並使用代碼 "newList = hmData.get("test");" 將其存儲在 newList 中時,僅從 A memory 位置檢索值(僅參考變量正在更改 -Stack Memory) . 當您更改存儲在 newList 中的 object 的值時,會更改 A memory 位置的值,該位置由兩個列表(arrData 和 newList)使用
就像Aayush Sethi說的 object 你從 hmData.get("test")
newList = hmData.get("test");
ResultData rNew = newList.get(1);
在兩個名稱下是相同的:newList 和 rNew。 如果您想擁有具有相同內容的不同對象,則必須克隆它(而 ResultData 應該是Cloneable的實現)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.