HashMap中ArrayList <Object>的奥秘

我只是运行以下代码,结果令我感到惊讶。有人可以解释一下这里发生了什么吗? 我的问题是..当我使用对象设置器将值设置为原始arraylist的新副本时,为什么原始arrayList中的对象值也被更改了?

请让我知道我在这里做错什么了。

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());  
}}
red2yuri 回答:HashMap中ArrayList <Object>的奥秘

原因:您使用新引用引用同一旧对象。 (存储在hmData中)。 因此,在对象级别,它们都引用了堆中相同的对象存储位置,这就是为什么更改一个值反映在另一个中。

更多说明: 假设arrData存储在“ A”存储位置。当您针对key =“ test”获得值并将其使用代码“ newList = hmData.get(” test“);”将其存储在newList中时,仅从A内存位置检索值(仅参考变量在更改-Stack Memory) 。 更改存储在newList中的对象的值时,将更改A内存位置的值,这两个列表(arrData和newList)都使用该内存位置

,

Aayush Sethi 所说的那样,您从hmData.get(“ test”)

中检索到的对象
newList = hmData.get("test");

ResultData rNew = newList.get(1);

在两个名称下是相同的:newList和rNew。如果您想要具有相同内容的其他对象,则必须对其进行克隆(而ResultData应该是 Cloneable 的实现)

本文链接:https://www.f2er.com/3097481.html

大家都在问