数据类型
数据类型分为基本数据类型(8种基本类型,String不算。有些人喜欢把 void 也算上,其实严格意义上来说,是不算的)和引用数据类型
基本数据类型一般存在栈中,但如果你要细究基本数据类型就一定会放在栈吗?那也不对,这个要看你在哪里声明,局部变量放在栈中,静态变量和实例变量放在堆中
引用数据类型栈中存的是该对象的引用,真实的数据存放在堆中。其中String类型非常特殊,属于引用类型,但是String类型的数据是存放在常量池中,无法修改(加了final)
应用场景
在了解这两个东西是什么之前,还是先看一下用在哪吧。深拷贝和浅拷贝只针对 对象 和 数组这样的引用类型
什么是浅拷贝?
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化
简单来说,浅拷贝只会复制某个对象的指针,新旧对象还是共享一块内存
什么是深拷贝?
深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。深拷贝后的对象与原来的对象是完全隔离的
简单来说,深拷贝会创建一个一模一样的对象,新旧对象不共享内存,修改新对象不会影响旧对象
为什么要使用深拷贝?
我们希望在改变新的数组或对象的时候,不改变原数组或对象就会用到
浅拷贝和深拷贝的区别?
举个例子,我有一个对象A,这个对象A中还嵌套了一个对象,我现在有一个对象B,A和B的结构完全一样,现在我把B赋给A。如果是浅拷贝,B会影响到A中的嵌套对象;如果是深拷贝则不会影响到A中的嵌套对象
实际应用
其实深拷贝经常会被用到,只是我不知道而已,new一个对象把他赋给另一个结构相同的对象就用到了深拷贝
而深拷贝效率比浅拷贝要低,因为浅拷贝只拷贝顶层数据,花费内存更少。SysDataCenterItem这个类中不可能去嵌套类,也不会在里面加数组,所以这段代码实际上会有性能问题,要考虑用浅拷贝替代深拷贝
其实我又想到了一个应用场景,是关于前台的,后台返回状态1 2 3,这些数字在前台展示的时候要赋予具体含义,比如说未支付,已支付,已完成。我现在希望展示的时候有具体的含义,在代码中我还是使用1 2 3做逻辑判断,那怎么办呢?用深拷贝啊
结语
这两年里我把市面上几乎所有的热门技术都看了一遍,正当我满以为技术债补完的时候,发现基础打得还是不够牢固,看来有时间还是要再回头看看基础