在java中执行以下列表代码的输出是什么

时间:2014-03-26 07:31:17

标签: java list arraylist

我在for循环的帮助下在列表中添加了五个对象。我正在for循环外初始化我的对象。在for循环体中,我正在更改对象setter属性并将其添加到列表中。这样的输出是:它将添加五个对象,但即使在为属性设置不同的值之后,它们也具有相同的属性。

请参阅以下代码

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class ASD {
    public static void main(String args[]) {
        List list = new ArrayList<A>();
        System.out.println("Before Insert List is " + list);
        A obj = new A();

        for (int i = 0; i < 5; i++) {
            obj.setA(new Random().nextInt(10));
            list.add(obj);
        }

        System.out.println("After Insert List is " + list);
        for (int i = 0; i < 5; i++) {
            A prObj = (A) list.get(i);
            System.out.println("Values are" + prObj.getA());
        }
    }
}

class A {
    int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

}

如果我在for循环中初始化A的对象,那么它将添加五个对象,并且还会更改对象的属性。任何人都可以解释这种行为

2 个答案:

答案 0 :(得分:3)

您只创建了一个实例并在for循环中多次设置它。在A循环内创建for的新实例,而不是在其外部

for (int i=0;i<5;i++) {
    A obj = new A();
    obj.setA(new Random().nextInt(10));
    list.add(obj);
}

答案 1 :(得分:2)

当你这样做时 -

A obj = new A();
for (int i=0;i<5;i++) {
    obj.setA(new Random().nextInt(10));
    list.add(obj);

您实际上是在更改了属性 setA 后添加对同一对象的引用。 这样,所有列表元素都引用了同一个对象(具有相同的值a )。

如果您想拥有不同的值,则需要添加新对象 -

for (int i=0;i<5;i++) {
        obj = new A(); // new object
        obj.setA(new Random().nextInt(10));
        list.add(obj);