Java拷贝:深拷贝和浅拷贝:
1.浅拷贝与深拷贝简介
浅拷贝:只拷贝原对象的地址,原对象的值发生改变的时候,拷贝对象的值会发生变化
深拷贝:是拷贝对象的所有值,原对象的值发生改变的时候,拷贝对象的值不受影响
2.浅拷贝的方式
直接使用"="进行赋值,
Person person = new Person(23,"阿尔杰");
Person person1 = person;
if(person1==person) {
System.out.println("两者地址相同");
}else {
System.out.println("两者地址不同");
}
System.out.println("将person1的age更改为30");
person1.setAge(30);
System.out.println("person的信息"+person.toString());
System.out.println("person1的信息"+person1.toString());
3.深拷贝的方式
1.构造器法(对象少量时,可以使用,要拷贝大量对象时,由于开销比较大,所以不推荐)
2.重写clone方法
重写clone的步骤
1.实现Cloneable接口,目的是告诉jvm本类允许被拷贝
2.重写Object类中的clone方法,修改clone方法的访问权限修饰符,由protect改为public
3.Apache Common Lang序列化
4.Gson序列化
5.Jackson序列化
深拷贝实例
public class Person implements Cloneable {
private String name;
private Address address;
// 实现clone方法进行深拷贝
@Override
public Person clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = address.clone(); // 对非基本类型属性进行深拷贝
return cloned;
}
}
使用序列化方式实现深拷贝实例
public class Person implements Serializable {
private String name;
private Address address;
// 使用对象的序列化和反序列化进行深拷贝
public Person deepCopy() {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
oos.flush();
ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (Person) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}