深拷贝与浅拷贝问题

定义:

浅拷贝:拷贝引用对象的地址,对拷贝对象的引用对象操作会影响原对象

深拷贝:复制一块堆内存,把引用对象的数据值拷贝一份,形成一个新的引用类型

判断:看子类对象地址有没有重新创建。原对象.子对象 == 拷贝对象.子对象

一、浅拷贝方法 

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);
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值