您的位置:首页 > 其它

添加一个对象到集合中时,集合里面存放的是对象的引用

2017-03-13 14:48 375 查看
当批量处理一些数据的时候,经常会将生成的对象放入集合中,这时候很容易犯一个错误,就是将已经放入集合中的对象修改部分属性后,又重新放入这个集合,表面上看是将一个新的对象放入集合中,实际上原来集合中的对象的属性已经被修改了。因为集合中存放的是对象的引用,改变原来对象的属性,那么从集合中得到的对象属性也就变了。下面一个示例就是这个问题

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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐