java - HashMap 中的 ArrayList<Object> 之谜

标签 java hashmap setter getter

我刚刚运行下面的代码,我对结果感到惊讶。有人可以解释一下这里发生了什么吗? 我的问题是..当我使用对象 setter 将值设置到原始 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());  
}}

最佳答案

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

多一点解释: 假设 arrData 存储在“A”内存位置。当您获取 key = "test"的值并使用代码 "newList = hmData.get("test");"将其存储在 newList 中时,仅从内存位置检索值(仅引用变量正在更改 - 堆栈内存) 。 当您更改存储在 newList 中的对象的值时,A 内存位置的值也会更改,该内存位置由两个列表(arrData 和 newList)使用

关于java - HashMap 中的 ArrayList<Object> 之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58871415/

相关文章:

java - html View 中的 iText 等宽字体,带有 css 样式的粗体、斜体

java - Map.Entry 接口(interface)如何在不创建对象的情况下调用 getValue()/getKey() 方法?

wpf - WPF中带有Setter的EventTrigger?

java - Jenkins 构建失败

java - 一个实体可以有多个多对多关系吗?

java - 如何在 Thymeleaf 中显示 BufferedImage

java - 具有多个键和多个值的 HashMap

java - 如何将一个 HashMap 列表中的不同值添加到另一个 HashMap 列表

class - 德尔福类: Property vs Get/Set methods

vb.net - 无法设置属性的属性