当我尝试将对象添加到列表时,下面的代码有什么问题

请参考下面的代码,让我知道我哪里出错了


public class EmployeeTest {


    public static void main(String[] args) {


        ArrayList<Employee> list = new ArrayList<>();


        list.add(new Employee("1026751","Jack Reacher"));

        list.add(new Employee("1026722","Tom Cruise"));


        System.out.println(list);

        //Employee a = list.get(0);

        Employee e = list.get(0);

        Employee p = list.get(1);

        list.clear();

        e.setEmployeeName("Rishabh Bansal");

        list.add(e);

        e.setEmployeeName("Jack Reacher");

        list.add(e);

        list.add(p);

        System.out.println(list);



    }


}

我想在上面添加元素


 0 index as "1026751","Rishabh Bansal" 

 1 index as "1026751","Jack Reacher"

 2 index as "1026722","Tom Cruise"

但不是它,我得到的列表是-:


[Employee [employeeId=1026751, employeeName=Jack Reacher], Employee [employeeId=1026751, employeeName=Jack Reacher], Employee [employeeId=1026722, employeeName=Tom Cruise]]

为什么 0 索引上的元素正在改变......


LEATH
浏览 115回答 2
2回答

慕少森

您Employee两次添加了相同的引用:e.setEmployeeName("Rishabh Bansal");list.add(e);e.setEmployeeName("Jack Reacher");list.add(e);但是这两个引用仍然指向同一个对象,你正在改变它。所以你也应该在这里创建新对象。

杨魅力

这是您的列表在前两个 add() 之后的样子:[oid1, oid2]oid1 和 oid2 是指向其状态保存在别处的对象的“指针”(引用):oid1 := Employee("1026751","Jack Reacher")oid2 := Employee("1026722","Tom Cruise")在两个 .get() 之后,您在这些对象上有两个“句柄”:e == oid1p == oid2然后清除列表,使列表变为:[]然后您更改两个对象之一的状态并将其添加到列表中,以便您拥有:[oid1]oid1 := Employee("1026751","Rishabh Bansal")oid2 := Employee("1026722","Tom Cruise")然后您更改同一对象的状态并将其再次添加到列表中,这样您就拥有:[oid1, oid1]oid1 := Employee("1026751","Jack Reacher")oid2 := Employee("1026722","Tom Cruise")所以索引 0 上的对象仅仅因为你的要求而改变了。如果你只有一个对象,你就只有一种状态。想要列表中的三个州?需要三个对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java