注意事项一:
这几天我在测试一段代码的时候发现了一个小坑,代码如下:
ArrayList<RolePermission> list = new ArrayList<>();
RolePermission rolePermission = new RolePermission();
for(int i=0;i<2;i++){
rolePermission.setRid(1);
rolePermission.setPid(2);
System.out.println("rolePermission = " + rolePermission);
list.add(rolePermission);
rolePermission.setRid(3);
rolePermission.setPid(4);
System.out.println("rolePermission = " + rolePermission);
list.add(rolePermission);
System.out.println("list = " + list);
}
我以为上述代码打印出来的list的值应该是list = [RolePermission{rid=1, pid=2}, RolePermission{rid=3, pid=4}],但是实际打印出来的结果却是list = [RolePermission{rid=3, pid=4}, RolePermission{rid=3, pid=4}]。
我想了想发现因为rolePermission 是写在循环体外部的因此它只指向一个rolePermission,我们把rolePermission存储到ArrayList中它只保存rolePermission的地址值,因此在ArrayList看来,它体内存储的两个对象是一样的,因此ArrayList内存储的数据只会记录最后一条,因此造成了重复数据的情况。正确撰写如下。
ArrayList<RolePermission> list = new ArrayList<>();
for(int i=0;i<2;i++){
RolePermission rolePermission = new RolePermission();
rolePermission.setRid(1);
rolePermission.setPid(2);
System.out.println("rolePermission = " + rolePermission);
list.add(rolePermission);
rolePermission.setRid(3);
rolePermission.setPid(4);
System.out.println("rolePermission = " + rolePermission);
list.add(rolePermission);
System.out.println("list = " + list);
}