我在下面的代码中理解第三个循环时遇到了一些麻烦。在第二个循环之后,列表没有改变,因此我假设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;
}
}
}
答案 0 :(得分:1)
在你的第二个for循环中,你将变量d引用到另一个Dog实例。
在你的第三个for循环中,你正在改变实例。
答案 1 :(得分:1)
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"));
}
然后,名称为z
的狗在索引i(对于列表大小范围内的所有i)的列表中(即替换)覆盖。然后打印出来:
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