添加一个对象到集合中时,集合里面存放的是对象的引用
2017-03-13 14:48
375 查看
当批量处理一些数据的时候,经常会将生成的对象放入集合中,这时候很容易犯一个错误,就是将已经放入集合中的对象修改部分属性后,又重新放入这个集合,表面上看是将一个新的对象放入集合中,实际上原来集合中的对象的属性已经被修改了。因为集合中存放的是对象的引用,改变原来对象的属性,那么从集合中得到的对象属性也就变了。下面一个示例就是这个问题
从表面上看没有逻辑问题,因为数据库中id是主键,那么重新生成主键再存入是没问题的,但是在保存数据的时候就报有重复主键,关键就是因为集合中存储的是对象的引用,重复将同一个对象的引用添加到集合中,保存数据的时候就出现了重复项了。
通过以下代码我们可以清晰的理解这个问题
monitorCompanyRiskGradeTrend = new MonitorCompanyRiskGradeTrend(); monitorCompanyRiskGradeTrend.setId(UUIDUtils.getUUID()); monitorCompanyRiskGradeTrend.setAccountId(accountId); monitorCompanyRiskGradeTrend.setCompanyName(monitorCompanyRisk.getCompanyName()); monitorCompanyRiskGradeTrend.setRiskGrade(monitorCompanyRisk.getRiskGrade()); monitorCompanyRiskGradeTrend.setCycle("1"); monitorCompanyRiskGradeTrend.setReportDate(calTrend.getTime()); monitorCompanyRiskGradeTrend.setCreateTime(calTrend.getTime()); monitorCompanyRiskGradeTrendList.add(monitorCompanyRiskGradeTrend); if(1 == calTrend.get(Calendar.DAY_OF_MONTH)){ monitorCompanyRiskGradeTrend.setId(UUIDUtils.getUUID()); monitorCompanyRiskGradeTrend.setCycle("3"); monitorCompanyRiskGradeTrendList.add(monitorCompanyRiskGradeTrend); } if(2 == calTrend.get(Calendar.DAY_OF_WEEK)){ monitorCompanyRiskGradeTrend.setId(UUIDUtils.getUUID()); monitorCompanyRiskGradeTrend.setCycle("2"); monitorCompanyRiskGradeTrendList.add(monitorCompanyRiskGradeTrend); }
从表面上看没有逻辑问题,因为数据库中id是主键,那么重新生成主键再存入是没问题的,但是在保存数据的时候就报有重复主键,关键就是因为集合中存储的是对象的引用,重复将同一个对象的引用添加到集合中,保存数据的时候就出现了重复项了。
通过以下代码我们可以清晰的理解这个问题
import java.util.ArrayList; import java.util.List; public class Test5 { public static void main(String args[]){ List<User> userList1 = new ArrayList<User>(); List<User> userList2 = new ArrayList<User>(); User user1 = new User(); userList1.add(user1); userList2.add(user1); System.out.println("SET VALUE FOR USERLIST2:"); for(User user: userList2){ user.setName("name"); user.setPassword("password"); } System.out.println("PRINT VALUE FOR USERLIST1:"); for(User user: userList1){ System.out.println(user.getName()); System.out.println(user.getPassword()); } } public static class User{ private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } }
相关文章推荐
- 添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?
- 添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?
- 添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?
- Java中对对象的操作是引用操作-建立Temp对象是,应该在循环里面new一个新的地址,再使用add添加到集合中去
- java判断一个字符串对象是否在一个集合里面
- 集合存放的是对象还是对象引用?
- 【Java学习笔记】不要把一个非临时可变对象添加入集合中!
- Java集合不能存放基本数据类型,只存放对象的引用
- 获取一个list集合里面的一个对象的一个属性对应的值,平凑成一个字符串
- Java集合不能存放基本数据类型,只存放对象的引用
- 一个ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢
- 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
- Map里面存放的是对象的引用
- 将对象添加到List集合中添加的是对象的引用
- Atitit 容器化技术之道 attilax著 1. 概念 1 1.1. 容器是应用服务器中位于组件和平台之间的接口集合。 1 1.2. 有时候也指集合的概念,里面可以存放不同对象 2 1.3. 、新
- 给定一个 ArrayList<Integer>的一个对象,实现在这个集合中添加一个字符串
- 往一个集合里面添加10个数字0-9,并且不相同
- 在framework里面添加一个theme,在app引用
- 如何 创建一个model对象保存到LIST集合里面并取出来
- 我用vs2005写了一个webservice用来查询sql2005数据库中表值,返回一个dataset类型集合,测试时候显示的xml文档没有问题,但是当我添加web引用的时候却无法正常显示而且报错原因之一。