【问题标题】:Writing same object with different value to collection将具有不同值的相同对象写入集合
【发布时间】:2015-09-11 11:25:53
【问题描述】:

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

我编写了一个简单的程序来突出我的意思。

为什么第一个值(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();未注释

[布拉沃 1,查理 2]

【问题讨论】:

    标签: java list jakarta-ee arraylist collections


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        以下代码:

        Student s1 = new Student();
        students.add(s1);
        students.add(s1);
        
        s1 = new Student();
        students.add(s1);
        

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

        【讨论】:

          猜你喜欢
          • 2020-06-20
          • 2019-12-10
          • 2018-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-24
          • 2018-08-22
          相关资源
          最近更新 更多