gpt4 book ai didi

java - HashMap 中的 ArrayList 之谜
转载 作者:行者123 更新时间:2023-12-01 21:16:21 25 4
gpt4 key购买 nike

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

25 4 0