我的ArrayList中重写了值

时间:2014-07-02 11:57:35

标签: java

我遇到了问题,或者我不理解代码段: 这是:

        List<Person> persons = new ArrayList<>();

        Person person = new Person();
        person.prename = "Klaus";
        for (int i = 0; i < 5; i++) {
            person.surname = String.valueOf(i);
            persons.add(person);
            System.out.println(person.prename + ". " + person.surname);
        }
        System.out.println("=======");

        for (Person person1 : persons) {
            System.err.println(person1.prename + ". " + person1.surname);
        }

结果是:

Klaus. 0
Klaus. 1
Klaus. 2
Klaus. 3
Klaus. 4
=======
Klaus. 4
Klaus. 4
Klaus. 4
Klaus. 4
Klaus. 4

为什么列表中的值会覆盖?我怎样才能阻止这样的结果呢?

4 个答案:

答案 0 :(得分:3)

您只需要在循环内创建人物。截至目前,您正在循环之外创建。

 for (int i = 0; i < 5; i++) {
            Person person = new Person();
            person.prename = "Klaus";
            person.surname = String.valueOf(i);
            persons.add(person);
            System.out.println(person.prename + ". " + person.surname);
        }

答案 1 :(得分:2)

每次插入相同的对象引用,然后更改内容 - 但对象引用仍然指向同一个人。解决方案:为每次迭代创建一个新对象。

for (int i = 0; i < 5; i++) {
    Person person = new Person();
    person.prename = "Klaus";
    person.surname = String.valueOf(i);
    persons.add(person)
    System.out.println(person.prename + ". " + person.surname);
}

答案 2 :(得分:1)

因为您只使用了一个对象并对Object进行了更改,所以最后一次更改只会应用于Object

Person person = new Person();//Move it inside loop

在循环内声明它以创建新的Objects

在循环内移动以下语句。

Person person = new Person();
person.prename = "Klaus";

顺便说一句

person.surname = String.valueOf(i);//I appreciate this rather than ""+i

答案 3 :(得分:1)

你正在设置同一个人5次,试试这个:

Person person = null;

        for (int i = 0; i < 5; i++) {
            person = new Person();
            person.prename = "Klaus";
            person.surname = String.valueOf(i);
            persons.add(person);
            System.out.println(person.prename + ". " + person.surname);
        }