gpt4 book ai didi

java - for 循环值或引用

转载 作者:行者123 更新时间:2023-12-02 04:15:34 24 4
gpt4 key购买 nike

我在理解下面代码中的第三个循环时遇到了一些困难。在第二次循环之后,列表没有改变,所以我假设 d 是列表中元素的副本。第三次输出后,元素的名称已更改,因此它不是副本。

public class Test {
public static void main(String[] args) {
List<Dog> list = new ArrayList<>();

list.add(new Dog("a"));
list.add(new Dog("b"));
list.add(new Dog("c"));
list.forEach(d -> System.out.println("dog name: " + d.getName())); // a,b,c

for (int i = 0; i < list.size(); i++) {
list.set(i, new Dog("z"));
}
list.forEach(d -> System.out.println("dog name: " + d.getName())); // z,z,z
for (Dog d : list) {
d = new Dog("y");
}
list.forEach(d -> System.out.println("dog name: " + d.getName())); // z,z,z

for (Dog d : list) {
d.setName("w");
}
list.forEach(d -> System.out.println("dog name: " + d.getName())); // w,w,w

}

public static class Dog {
private String name;

public Dog(String n) {
name = n;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
}

最佳答案

    list.add(new Dog("a"));
list.add(new Dog("b"));
list.add(new Dog("c"));

这增加了三个 Dog添加到您的列表,其中包含名称 a , b ,和c 。然后打印它们:

    list.forEach(d -> System.out.println("dog name: " + d.getName())); 

a,b,c

    for (int i = 0; i < list.size(); i++) {
list.set(i, new Dog("z"));
}

然后,它们在列表中的索引 i(对于列表大小范围内的所有 i)处被名称为 z 的狗覆盖(即替换)。 。然后将它们全部打印出来:

    list.forEach(d -> System.out.println("dog name: " + d.getName())); 

z,z,z

然后,您为列表中的每只狗创建了一个新的临时引用,并将它们全部命名为 y 。循环结束后,这个临时引用超出了范围,因此狗仍然被命名为 z .

    for (Dog d : list) {
d = new Dog("y");
}
list.forEach(d -> System.out.println("dog name: " + d.getName()));

z,z,z

然后,您将列表中的每只狗重命名为 w .

    for (Dog d : list) {
d.setName("w");
}

list.forEach(d -> System.out.println("dog name: " + d.getName()));

w,w,w

关于java - for 循环值或引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359369/

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