为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

LEATH 2021-10-20 15:55:19
请参考下面的代码,让我知道我哪里出错了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 索引上的元素正在改变......
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您Employee两次添加了相同的引用:


e.setEmployeeName("Rishabh Bansal");

list.add(e);

e.setEmployeeName("Jack Reacher");

list.add(e);

但是这两个引用仍然指向同一个对象,你正在改变它。


所以你也应该在这里创建新对象。


查看完整回答
反对 回复 2021-10-20
?
杨魅力

TA贡献1811条经验 获得超6个赞

这是您的列表在前两个 add() 之后的样子:


[oid1, oid2]

oid1 和 oid2 是指向其状态保存在别处的对象的“指针”(引用):


oid1 := Employee("1026751","Jack Reacher")

oid2 := Employee("1026722","Tom Cruise")

在两个 .get() 之后,您在这些对象上有两个“句柄”:


e == oid1

p == 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 上的对象仅仅因为你的要求而改变了。如果你只有一个对象,你就只有一种状态。想要列表中的三个州?需要三个对象。


查看完整回答
反对 回复 2021-10-20
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信