案例:java
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;
}
}
輸出結果:this
====0=======
bb
原始值
21
====1=======
bb
原始值
21對象
問題:從結果表項上看list中的前一個對象的值被後一個對象給覆蓋了。rem
User user =new User();
user=userTemp;get
緣由:地址指向同一對象,List<User> 中的User都引用了同一對象,而這個對象就是userTemp=new User();靜態塊裏建立的;for循環對其修改,實際修改的是同一對象,固會出現後面的值覆蓋前面的值的現象;io
解決方案:for循環
方案1——class
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());
}
}import
輸出:List
====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