簡體   English   中英

ArrayList 之謎<object>在 HashMap<div id="text_translate"><p> 我只是在運行下面的代碼,我對結果感到驚訝。 有人可以解釋一下這里發生了什么嗎? 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?</p><p> 如果我在這里做錯了什么,請告訴我。</p><pre> public class TestHashMap { public static void main(String[] args) { HashMap&lt;String, ArrayList&lt;ResultData&gt;&gt; hmData = new HashMap&lt;String, ArrayList&lt;ResultData&gt;&gt;(); ArrayList&lt;ResultData&gt; arrData = new ArrayList&lt;ResultData&gt;(); for (int i = 0; i &lt; 10; i++) { ResultData rData = new ResultData(); rData.setDy(i + 1); arrData.add(rData); } hmData.put("test",arrData); System.out.println("Before &gt;&gt;&gt;&gt; "+hmData.get("test").get(1).getDy()); ArrayList&lt;ResultData&gt; newList = new ArrayList&lt;ResultData&gt;(); newList = hmData.get("test"); ResultData rNew = newList.get(1); rNew.setDy(1234566); System.out.println("##### &gt;&gt;&gt;&gt;&gt; "+arrData.get(1).getDy()); System.out.println("After &gt;&gt;&gt;&gt; "+hmData.get("test").get(1).getDy()); }}</pre></div></object>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM