gpt4 book ai didi

java - 在迭代 HashMap 时将对象设置为 null 是否会对对象的状态产生影响

转载 作者:行者123 更新时间:2023-12-01 07:22:51 25 4
gpt4 key购买 nike

我有一个简单的程序,我在其中迭代 map 并将对象设置为 null,而不是将 map 内的值更新为 null。我想知道为什么它不允许我使对象无效,但是如果我在迭代时更改对象的任何值,对象就会显示为已更改,请帮助我理解这种行为。 (这个问题听起来像是新手)

Map<String, MyObj> map = new HashMap<>();
map.put("a", new MyObj("XYZ"));
map.put("b", new MyObj("FOO"));
map.put("c", new MyObj("BAR"));

System.out.println(map);

// output : {a=sample.MyObj@15db9742, b=sample.MyObj@6d06d69c, c=sample.MyObj@7852e922}
for(Entry<String, MyObj> e : map.entrySet()){
MyObj o = e.getValue();
//set the object to null
o = null;

}
// printing map to see if values are null now.
System.out.println(map);

// output : {a=sample.MyObj@15db9742, b=sample.MyObj@6d06d69c, c=sample.MyObj@7852e922}

最佳答案

这里有两件事发挥作用:变量的局部范围,以及引用类型与原始类型相比的行为。

当您有 for (MyObj i : map.values().toArray(ar)) 时,i 位于 for< 的范围内 并仅指向 MyObj 的实例。它是引用文献的副本。当您将 i 设置为 null 时,您只是更改了 i 的本地值(即副本);原始引用仍然指向原始实例。由于 i指向 MyObj 的实例,因此您不会更改 MyObj 本身的实例。实际上,当您将某些内容设置为 null 时,您只是说它没有指向某些内容。当它非空时,它指向该类型的一个实例。

但是,如果您使用 i 执行某些操作,则可能通过调用一个方法,您将在 实例上调用它我 指向。这是因为原始引用和副本都指向同一事物。所以你最终修改了对象本身。例如,假设您执行 i.setFoo(10),那么您将修改 i 指向的 MyObj 实例,并且将该实例上的 foo 值设置为 10

重要的是要了解,对于引用类型,只需将变量的值重新分配给null(或任何其他实例)不会修改对象它指向的内容。您所做的只是使变量指向其他内容(或者在null的情况下根本不指向任何内容)。

现在,如果您有一个基元数组(比方说 int[]),您也会看到同样的事情:

for(int i : intArr) {
i = 10;
}

这不会将 intArr 中的每个位置设置为 10。为什么?这是因为在这种情况下,i 又是一个局部变量。所以这个iintArr中值的副本。因此,当您将值重新分配给其他内容时,您只需更改副本的值,而不是原始值。

关于java - 在迭代 HashMap 时将对象设置为 null 是否会对对象的状态产生影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com