本文主要是介绍Java中深拷贝和浅拷贝是什么,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Java中,深拷贝和浅拷贝是用来描述对象复制的两种方式,它们在复制对象时处理引用类型属性的方式不同。
-
浅拷贝(Shallow Copy):
- 浅拷贝只复制对象的基本数据类型字段和引用字段的引用,而不复制引用对象所指向的数据。当你对一个对象做浅拷贝时,新的对象和原始对象会引用同一块内存地址中的子对象。也就是说,对新的对象中引用子对象的修改,也会影响到原始对象的子对象。
- 在Java中,使用
Object
类的clone()
方法可以实现浅拷贝,前提是类实现了Cloneable
接口。 - 示例代码:
class Address { String city; public Address(String city) { this.city = city; }
} class Person implements Cloneable { String name; Address address; public Person(String name, Address address) { this.name = name; this.address = address; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
} public class Main { public static void main(String[] args) throws CloneNotSupportedException { Address address = new Address("New York"); Person person1 = new Person("John", address); Person person2 = (Person) person1.clone(); // 修改person2的地址 person2.address.city = "Los Angeles"; // person1的地址也会受到影响 System.out.println(person1.address.city); // 输出: Los Angeles }
}
2.深拷贝(Deep Copy):
- 深拷贝不仅复制对象的基本数据类型字段,还会创建新的实例并递归复制所有引用类型字段。这样,新的对象和原始对象就完全独立,修改一个对象不会影响另一个对象。
- 实现深拷贝通常需要手动编写代码来复制引用对象的内容,或者使用序列化和反序列化的方式来实现。
- 示例代码:
class Address { String city; public Address(String city) { this.city = city; } public Address(Address address) { this.city = address.city; }
} class Person { String name; Address address; public Person(String name, Address address) { this.name = name; this.address = new Address(address); } public Person deepCopy() { return new Person(this.name, this.address); }
} public class Main { public static void main(String[] args) { Address address = new Address("New York"); Person person1 = new Person("John", address); Person person2 = person1.deepCopy(); // 修改person2的地址 person2.address.city = "Los Angeles"; // person1的地址不受影响 System.out.println(person1.address.city); // 输出: New York }
}
总结来说,浅拷贝只复制对象的引用,而深拷贝则是创建新对象并递归复制所有字段。选择使用哪种拷贝方式应根据实际需求来决定。
这篇关于Java中深拷贝和浅拷贝是什么的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!