前言
由于最近写业务逻辑的时候遇到了浅拷贝与深拷贝问题,因此特地记录一下。
定义一个实体类Person
public class Person implements Cloneable{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Object clone() {
Person person = null;
try {
person = (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
深拷贝
public class TeamA implements Cloneable {
private int classNo;
private List<Person> persons;
public TeamA(int classNo, List<Person> persons) {
this.classNo = classNo;
this.persons = persons;
}
@Override
public Object clone() {
TeamA team = null;
try {
team = (TeamA) super.clone();
List<Person> personList = new ArrayList<>();
for (int i = 0; i < persons.size(); i++) {
personList.add((Person) persons.get(i).clone());
}
team.persons = personList;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return team;
}
public int getClassNo() {
return classNo;
}
public void setClassNo(int classNo) {
this.classNo = classNo;
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
@Override
public String toString() {
return "Team{" +
"classNo=" + classNo +
", persons=" + persons +
'}';
}
}
测试代码
public static void testA() {
List<Person> personList = new ArrayList<>();
personList.add(new Person("Jeremy",18));
TeamA teamA1 = new TeamA(1, personList);
TeamA teamA2 = (TeamA) teamA1.clone();
Log.d("deepCopy","before teamA1 = " + teamA1);
Log.d("deepCopy","before teamA2 = " + teamA2);
teamA1.getPersons().add(new Person("Sun", 36));
teamA1.setClassNo(2);
Log.d("deepCopy","after teamA1 = " + teamA1);
Log.d("deepCopy","after teamA2 = " + teamA2);
}
测试结果
06-11 15:42:23.426 D/deepCopy(11318): before teamA1 = Team{classNo=1, persons=[Student{name='Jeremy', age=18}]}
06-11 15:42:23.426 D/deepCopy(11318): before teamA2 = Team{classNo=1, persons=[Student{name='Jeremy', age=18}]}
06-11 15:42:23.426 D/deepCopy(11318): after teamA1 = Team{classNo=2, persons=[Student{name='Jeremy', age=18}, Student{name='Sun', age=36}]}
06-11 15:42:23.426 D/deepCopy(11318): after teamA2 = Team{classNo=1, persons=[Student{name='Jeremy', age=18}]}
浅拷贝
public class TeamB implements Cloneable {
private int classNo;
private List<Person> persons;
public TeamB(int classNo, List<Person> persons) {
this.classNo = classNo;
this.persons = persons;
}
@Override
public Object clone() {
TeamB team = null;
try {
team = (TeamB) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return team;
}
public int getClassNo() {
return classNo;
}
public void setClassNo(int classNo) {
this.classNo = classNo;
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
@Override
public String toString() {
return "Team{" +
"classNo=" + classNo +
", persons=" + persons +
'}';
}
}
测试代码
public static void testB() {
List<Person> personList = new ArrayList<>();
personList.add(new Person("Jeremy",18));
TeamB teamB1 = new TeamB(1, personList);
TeamB teamB2 = (TeamB) teamB1.clone();
Log.d("shallowCopy","before teamB1 = " + teamB1);
Log.d("shallowCopy","before teamB2 = " + teamB2);
teamB1.getPersons().add(new Person("Sun", 36));
teamB1.setClassNo(2);
Log.d("shallowCopy","after teamB1 = " + teamB1);
Log.d("shallowCopy","after teamB2 = " + teamB2);
}
测试结果
06-11 15:42:23.428 D/shallowCopy(11318): before teamB1 = Team{classNo=1, persons=[Student{name='Jeremy', age=18}]}
06-11 15:42:23.428 D/shallowCopy(11318): before teamB2 = Team{classNo=1, persons=[Student{name='Jeremy', age=18}]}
06-11 15:42:23.431 D/shallowCopy(11318): after teamB1 = Team{classNo=2, persons=[Student{name='Jeremy', age=18}, Student{name='Sun', age=36}]}
06-11 15:42:23.431 D/shallowCopy(11318): after teamB2 = Team{classNo=1, persons=[Student{name='Jeremy', age=18}, Student{name='Sun', age=36}]}
网友评论