标签:
案例:
package com.util;
import java.util.ArrayList;
import java.util.List;
public class CopyObjectUtil {
private static List<String> list;
private static User userTemp;
static{
list=new ArrayList<String>();
list.add("aa");
list.add("bb");
userTemp=new User();
userTemp.setName("CA");
userTemp.setRemark("原始值");
userTemp.setAge(20);
}
public static void main(String[] args) {
List<User> userList=new ArrayList<User>();
for(int i=0;i<list.size();i++){
User user =new User();
user=userTemp;
user.setName(list.get(i));
user.setAge(user.getAge()+i);
userList.add(user);
}
int i=0;
for(User o : userList){
System.out.println("===="+i+++"=======");
System.out.println(o.getName());
System.out.println(o.getRemark());
System.out.println(o.getAge());
}
}
}
class User{
private String name;
private String remark;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
输出结果:
====0=======
bb
原始值
21
====1=======
bb
原始值
21
问题:从结果表项上看list中的前一个对象的值被后一个对象给覆盖了。
User user =new User();
user=userTemp;
原因:地址指向同一对象,List<User> 中的User都引用了同一对象,而这个对象就是userTemp=new User();静态块里创建的;for循环对其修改,实际修改的是同一对象,固会出现后面的值覆盖前面的值的现象;
解决方案:
方案1——
public static void main(String[] args) throws Exception{
List<User> userList=new ArrayList<User>();
for(int i=0;i<list.size();i++){
User user =new User();
user=(User)BeanUtils.cloneBean(userTemp);
user.setName(list.get(i));
user.setAge(user.getAge()+i);
userList.add(user);
}
int i=0;
for(User o : userList){
System.out.println("===="+i+++"=======");
System.out.println(o.getName());
System.out.println(o.getRemark());
System.out.println(o.getAge());
}
}
输出:
====0=======
aa
原始值
20
====1=======
bb
原始值
21
方案2——
public static void main(String[] args) throws Exception{
List<User> userList=new ArrayList<User>();
for(int i=0;i<list.size();i++){
User user =new User();
BeanUtils.copyProperties(userTemp, user);
user.setName(list.get(i));
user.setAge(user.getAge()+i);
userList.add(user);
}
int i=0;
for(User o : userList){
System.out.println("===="+i+++"=======");
System.out.println(o.getName());
System.out.println(o.getRemark());
System.out.println(o.getAge());
}
}
输出:
aa
原始值
20
====1=======
bb
原始值
21
标签:
原文地址:http://my.oschina.net/u/2494018/blog/525474