深拷贝和浅拷贝

本文介绍Java中数组拷贝的方法,包括Arrays.copyOf和System.arraycopy的使用,并探讨了浅拷贝与深拷贝的区别及实现方式,如通过构造方法、重写clone方法以及利用Jackson库进行对象序列化来完成深拷贝。

一 了解 arrays.copyof  底层为System.arraycopy

//:src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度。 System.arraycopy(a,0,b,0,1);

int[] a = {1, 2, 3};
int[] ints = java.util.Arrays.copyOf(a, 4);

clone 和 System.arraycopy 都为浅拷贝 

 

  User [] users=new User[]
                {new User("admin","admin@qq.com"),new User("maco","maco@qq,com"),new User("kitty","kitty@qq,com")};
        User [] target=new User[users.length];//新建一个目标对象数组
        System.arraycopy(users, 0, target, 0, users.length);//实现复制
        User[] clone = users.clone();
        System.out.println("源对象与目标对象的物理地址是否一样:"+(users[0] == target[0]?"浅复制":"深复制"));
        System.out.println("源对象与目标对象的物理地址是否一样:"+(users[0] == clone[0]?"浅复制":"深复制"));
        clone[0].setPassword("admin@sina.com");
        System.out.println("修改后的users");
        for (User user : users){
            System.out.println(user);
        }
    }

二 深拷贝的几种方法

2.1 通过构造方法来实现

 Address address = new Address("河南");
 Address address1 = new Address("河南1");

 User user =new User("juan","111",address);
User copy = new User(user.getName(),user.getPassword(),new Address(address.getCity()));
           copy.setAddress(address1);
 System.out.println(copy);
 System.out.println(user==copy);

2.2通过重写clone来实现   但实体类必须实现cloneable 接口

User user1 = user.clone();
user1.getAddress().setCity("深圳");

2.3通过jackson的方式来实现

    // 使用Jackson序列化进行深拷贝

 

ObjectMapper objectMapper = new ObjectMapper(); User copyUser = objectMapper.readValue(objectMapper.writeValueAsString(user), User.class);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值