1、基本数据类型和引用数据类型
聊深拷贝和浅拷贝之前先来看看基本数据类型和引用数据类型:
java的基本数据类型有8种:byte、short、int、long、float、double、boolean、char
其余的类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型等非基本数据类型都是引用数据类型。
2、数据的内存位置
基本数据类型:直接存储在栈中;
引用数据类型:在栈中存储的是对象的引用,真实的数据存放在堆内存里;
详细内容参考:
3、深拷贝和浅拷贝
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
深拷贝:产生一个新对象。对原对象的基本数据类型进行值传递;对原对象的引用数据类型,创建一个新的对象,并复制其内容,两个引用指向两个对象,但对象内容相同。
浅拷贝:产生一个新对象,对原对象的基本数据类型进行值传递;对原对象的引用数据类型,复制一个引用指向原始引用的对象,复制的引用和原始引用指向同一个对象。
浅拷贝和深拷贝的相同之处:
(1)两种方法都会新建一个对象,
(2)两种方法修改基本类型数据的属性并不会对原对象产生影响;
区别:
对子对象的复制方式不同。浅拷贝修改了子对象,会对原对象产生影响;而深拷贝修改子对象不会对原对象产生影响。
4、区分赋值和浅拷贝
赋值是将某一数值或对象赋给某个变量的过程,分为:
1、基本数据类型:赋值,赋值之后两个变量互不影响
2、引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象,相互之间有影响
区别:
(1)赋值不会新建对象,和原数据指向同一个对象;浅拷贝会新建对象,不会和原数据指向同一个对象。
(2)赋值因为和原数据指向同一个对象,所以不管是修改基本数据类型,还是子对象,都会使原数据一起发生改变;
而浅拷贝,修改基本数据类型不会使原数据一起发生改变,但是修改子对象会使原数据一起发生改变。
!!!注意如果是对基本数据类型的变量进行赋值,赋值之后两个变量是互不影响的。!!!
5、总结:对“引用数据类型”进行赋值、浅拷贝、深拷贝的区别

6、拓展:不可变对象
在搜索浅拷贝和深拷贝的时候,发现有些博主会提到不可变对象,贴个链接,简单了解一下。
本文详细介绍了Java中深拷贝和浅拷贝的概念,区别在于深拷贝创建新对象并复制引用数据类型的内容,而浅拷贝仅复制引用。讨论了赋值与浅拷贝的差异,以及它们对基本数据类型和引用数据类型的影响。同时,文章还探讨了不可变对象在Java中的应用。
https://www.cnblogs.com/maskwolf/p/9972982.html
1419

被折叠的 条评论
为什么被折叠?



