定义:
浅拷贝:拷贝引用对象的地址,对拷贝对象的引用对象操作会影响原对象
深拷贝:复制一块堆内存,把引用对象的数据值拷贝一份,形成一个新的引用类型
判断:看子类对象地址有没有重新创建。原对象.子对象 == 拷贝对象.子对象
一、浅拷贝方法
1.Hutool的属性拷贝
BeanUtil.copyProperties(Object source, Class<T> tClass, String... ignoreProperties);
//用户类
public class User{
private String name;
//地址子对象
private AddressTest addressTest;
public User(String name){
this.name = name;
}
}
//地址类
public class AddressTest{
private String addr;
public AddressTest(String addr){
this.addr= addr;
}
}
public class Test{
public static void main(String[] args) {
User user = new User("孙悟空");
AddressTest addressTest = new AddressTest("花果山");
user.setAddressTest(addressTest);
//hutool bean拷贝
User user1 = BeanUtil.copyProperties(user, User.class);
System.out.println(user1.toString());
//User{name='孙悟空', addressTest=AddressTest{addr='花果山'}}
//改变user1的属性,查看user对象有没有改变
user1.setName("六耳");
System.out.println(user.toString());
//User{name='孙悟空', addressTest=AddressTest{addr='花果山'}}
//获取user1子对象改变其属性,查看user对象子对象有没有改变
user1.getAddressTest().setAddr("西天");
System.out.println(user.toString());
//User{name='孙悟空', addressTest=AddressTest{addr='西天'}}
//改变拷贝对象的子类对象 原对象的子类对象也会被改变
//即拷贝对象的子类对象与原对象的子类对象地址相同
System.out.println(user.getAddressTest() == user1.getAddressTest());
//true
}
}
二、深拷贝实现方式
1.直接new
通过new创建的对象都是新的地址
User deepCopyUser = new User().setAddressTest();
2.clone方法
1)实现Cloneable,重写clone()方法
2)引用变量发生变化需要修改clone方法public User copyUser2() throws CloneNotSupportedException { User cloneUser = this.clone(); if(this.getCar() != null) { cloneUser.setCar(this.getCar().clone()); } return cloneUser; }
3.使用IO流方式实现
通过IO流序列化和反序列化,需要实现Serializable接口
public User copyUser3() throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (User) ois.readObject(); }
4.json序列化反序列化
1) hutool
List<User> userList = JSONUtil.toList(JSONUtil.parseArray(list), User.class);
2) Gson
User pm = new User("Prime", "Minister", address);
Gson gson = new Gson();
User deepCopy = gson.fromJson(gson.toJson(pm), User.class);
3)jackson
public User copyUser4() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(objectMapper.writeValueAsString(this),User.class);
}