详谈java浅拷贝与深拷贝

it2022-05-05  171

引用类型的数组存的是地址浅拷贝 基本类型记录的是数据深拷贝 什么是浅拷贝呢简单的来说就是大家指向了同一个引用 加入有一个类Cat他有一个name属性

public class Cat{ String name; . . . } Cat a = new Cat(); a.name = "mimi"; Cat b = a; b.name = "mimi2";

执行完这段代码a.name会是多少呢

测试的结果是mimi2 说明改变了 那么内存中是如何改变的呢

当b.name发生后就变成了虚线的指向这就是浅拷贝 如何达到深拷贝呢 需要对b这个变量new一个空间出来

Cat a = new Cat(); a.name = "mimi"; Cat b = new Cat; b.name = a.name;

如果此时改变b的name a会有变化嘛 答案是:没有 还是mimi 读者可以自行尝试

则当b.name发生改变时只是改变了 b.name的引用如虚线表示而并不会影响到a的name属性这就是深拷贝 而基本基本类型都是在存在栈空间所以都有自己单独的空间数据 数据将会直接copy到对应的空间中

假如a b都是整数 b = a 发生的内存是这样的

所以基本类型拷贝的是数据而不是地址因此改变a不会受影响

**注意:**arrays.copyof 也是不安全的,也出现了浅拷贝的问题当有嵌套集合存在时第一层不会出现问题 但是二三层就会出现浅拷贝问题


最新回复(0)