深拷贝与浅拷贝
发布于 2023-03-01
什么是深拷贝和浅拷贝
Section titled “什么是深拷贝和浅拷贝”在计算机内存中,每个对象都有一个地址,这个地址指向对象在内存中存储的位置。当我们使用变量引用一个对象时,实际上是将该对象的地址赋值给变量。因此,如果我们将一个对象复制到另一个变量中,实际上是将对象的地址复制到了这个变量中。
浅拷贝是指将一个对象复制到另一个变量中,但是只复制对象的地址,而不是对象本身。也就是说,原始对象和复制对象实际上是共享同一个内存地址的。 因此,如果我们修改了复制对象中的属性或元素,原始对象中对应的属性或元素也会被修改。
在Java中,我们常用的各种BeanUtils基本也都是浅拷贝的。
深拷贝是指将一个对象及其所有子对象都复制到另一个变量中,也就是说,它会创建一个全新的对象,并将原始对象中的所有属性或元素都复制到新的对象中。 因此,如果我们修改复制对象中的属性或元素,原始对象中对应的属性或元素不会受到影响。
如何实现深拷贝
Section titled “如何实现深拷贝”实现Cloneable接口,重写clone()
Section titled “实现Cloneable接口,重写clone()”public class Address implements Cloneable{ private String province; private String city; private String area; //省略构造函数和setter/getter
@Override public Object clone() throws CloneNotSupportedException { return super.clone(); }}
class User implements Cloneable{ private String name; private String password; private HomeAddress address; //省略构造函数和setter/getter
@Override protected Object clone() throws CloneNotSupportedException { User user = (User)super.clone(); user.setAddress((HomeAddress)address.clone()); return user; }}序列化实现深拷贝
Section titled “序列化实现深拷贝”我们可以借助序列化来实现深拷贝。先把对象序列化成流,再从流中反序列化成对象,这样就一定是新的对象了。 序列化的方式有很多,比如我们可以使用各种JSON工具,把对象序列化成JSON字符串,然后再从字符串中反序列化成对象。
// fastjsonUser newUser = JSON.parseObject(JSON.toJSONString(user), User.class);除此之外,还可以使用Apache Commons Lang中提供的SerializationUtils工具实现。 我们需要修改下上面的User和Address类,使他们实现Serializable接口,否则是无法进行序列化的。
class User implements Serializableclass Address implements SerializableUser newUser = (User) SerializationUtils.clone(user); 发布于 2023-03-01