JAVA对象拷贝(copy)问题
最近项目中用到了集合深拷贝(值和引用同时copy),结果尝试了几种方法都为浅拷贝(只copy引用)。
比如用集合初始化新集合,或者指定其固定长度,亦或用collections.copy(dest, src),代码如下:
1.List<User> copyList = new ArrayList<User>(Arrays.asList(new User[srcList.size()]));
2.List<User> copyList = new ArrayList<User>(srcList);
3.Collections.copy(copyList, srcList);
......
通过查看API发现Object.clone()执行的为深拷贝。
import java.util.ArrayList;
import java.util.List;
public class ObjectCopyTest {
public static void main(String[] args) {
// define and init source collection.
List<User> srcList = new ArrayList<User>();
for (int i = 0; i < 3; i++) {
User user = new User();
user.setId(i + 1);
user.setName("name" + (i + 1));
user.setPwd("pwd" + (i + 1));
srcList.add(user);
}
// collection(object) copy.
List<User> destList = new ArrayList<User>();
for (User user : srcList) {
User userCopy = user.clone(); // user object copy
userCopy.setName("motrsky" + user.getId());
destList.add(userCopy);
}
// print result
for (User user : destList) {
System.out.println("id=" + user.getId() + "---name=" + user.getName() + "---pwd=" + user.getPwd());
}
}
}
class User implements Cloneable {
private int id;
private String name;
private String pwd;
@Override
public User clone() {
User user = null;
try {
user = (User)super.clone();
} catch (Exception e) {
System.out.println("The User object cloning has failed.");
e.getStackTrace();
}
return user;
}
// getters and setters...
}
执行结果如下:
id=1---name=motrsky1---pwd=pwd1
id=2---name=motrsky2---pwd=pwd2
id=3---name=motrsky3---pwd=pwd3