JAVA浅拷贝和深拷贝
-
Java 对象拷贝是为对象赋值的一种方式,简单来说就是创建一个和原对象相同的对象,新创建的对象是原对象的一个副本,面试官贼拉喜欢在面试的时候问一问你浅拷贝和深拷贝的原理。因为它涉及到对象的引用关系,涉及到 Java 是传值还是传递引用关系,这通常是面试的重点。
在 Java 中,除了基本数据类型之外,还存在引用数据类型。一般使用 = 号做赋值操作的时候,对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,也就是将原对象的引用传递过去,但是他们实际上还是指向的同一个对象。
浅拷贝和深拷贝其实就是在引用的这个基础上来做区分的,如果在拷贝的时候,只对基本数据类型进行拷贝,对引用数据类型只是进行了引用的传递,没有真正的创建一个新的对象,这种拷贝方式就认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,这种拷贝方式就被认为是深拷贝。
浅拷贝(Shallow copy):简听起来这个概念十分的抽象,但是实践起来其实十分的简单,就是在需要拷贝的类上实现 Cloneable 接口并重写其 clone() 方法就可以了。深拷贝:简单来说,深拷贝就是的另一种说法。在进行对象拷贝的基础上,对对象的成员变量也依次拷贝的方式被称为深拷贝。
操作深拷贝和浅拷贝需要注意些什么呢?如果对象的属性都是基本数据类型,那么可以使用浅拷贝。如果对象有引用类型,那就要基于具体的需求来选择浅拷贝还是深拷贝。如果对象嵌套层数比较多,推荐使用 Serializable 接口实现深拷贝。如果对象引用任何时候都不会被改变,那么没必要使用深拷贝,只需要使用浅拷贝就行了。如果对象引用经常改变,那么就要使用深拷贝。没有一成不变的规则,一切都取决于具体需求。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏