for循环值或引用

时间:2015-10-27 03:17:10

标签: java foreach

我在下面的代码中理解第三个循环时遇到了一些麻烦。在第二个循环之后,列表没有改变,因此我假设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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在你的第二个for循环中,你将变量d引用到另一个Dog实例。

在你的第三个for循环中,你正在改变实例。

答案 1 :(得分:1)

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

这会在您的列表中添加三个Dog个名称abc。然后打印出来:

    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