将具有不同值的相同对象写入集合

时间:2015-09-11 11:25:53

标签: java list java-ee arraylist collections

我的问题是,在将对象添加到具有不同值的集合之前,是否必须重新初始化对象?

我写了一个简单的程序来强调我的意思。

为什么第一个值(Bravo,1)在下面的例子中被覆盖

s1 = new student();

内部类TestStudent类中的

被评论

学生班

public class student {

    String name;
    int id;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return this.getName() + " " + this.getId();
    }

}//close student

TestStudent类

public class TestStudent {

public static void main(String args[]){


    student s1 = new student();

    List<student> studlist = new ArrayList<student>();

    s1.setId(1);
    s1.setName("Bravo");

    studlist.add(s1);

    //output is as expected when the below line in uncommented.
    s1 = new student();

    s1.setId(2);
    s1.setName("charlie");

    studlist.add(s1);

    System.out.println( Arrays.toString(studlist.toArray()) );

}//psvm

}//end class

输出行s1 = new student();评论

[查理2,查理2]

输出行s1 = new student();未注释

[Bravo 1,charlie 2]

3 个答案:

答案 0 :(得分:4)

您可以再次将其添加到集合中。但是,当您更改对象的值时,它们会反映到输出中,因为列表的第一个元素引用该对象。 List仅保存对象的引用,而不是对象的副本。

答案 1 :(得分:4)

请参阅,ListSet等集合只是保留对堆上对象的引用。因此,在您的情况下,s1studList's index 0都引用相同的Student实例。因此,通过s1更改对象将反映在对studList.get(0)的调用中。如果您执行s1 = new student();,则s1将不再指向旧的Student实例。因此,更改它不会影响列表。

答案 2 :(得分:1)

以上两个答案都很好。我发现图表有时更容易理解。

以下代码:

foo
---
$VAR1 = {
          'B' => {
                   'st' => 'b',
                   'qt' => 'b'
                 },
          'A' => {
                   'qt' => 'a',
                   'st' => 'a'
                 }
        };


bar
---
$VAR1 = {
          'B' => {
                   'st' => 'b',
                   'qt' => 'b'
                 },
          'A' => {
                   'qt' => 'a',
                   'st' => 'a'
                 }
        };

生成以下数据结构。请注意,前两个项目指向同一个实例。 (忽略club.bowling.GameTest包名:))

enter image description here