当前位置: 首页> 财经> 股票 > Java中的深拷贝与浅拷贝

Java中的深拷贝与浅拷贝

时间:2025/7/13 6:22:40来源:https://blog.csdn.net/weixin_43591980/article/details/115702607 浏览次数:0次

深拷贝和浅拷贝区别是什么?

  • 数据分为基本数据类型和引用数据类型。基本数据类型:数据直接存储在栈中;引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存里。
  • 浅拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。
  • 深拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。
  • 深拷贝相比于浅拷贝速度较慢并且花销较大。

深拷贝/浅拷贝分析案例

  • 浅拷贝实现 Cloneable,深拷贝是通过实现 Serializable 读取二进制流

深拷贝实现

首先Person 对象实现 Serializable 接口,然后自定义深拷贝方法 deepClone()

/*** 深拷贝* * 注意:要实现序列化接口* @return*/
public Person deepClone() {try {// 输出 (序列化)ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);// 输入 (反序列化)ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);Person person = (Person) ois.readObject();return person;} catch (Exception e) {e.printStackTrace();return null;}
}

接下来验证一下深拷贝是否成功:

@Test
public void testPropotype() throws CloneNotSupportedException {Person person1 = new Person();person1.setAge(22);person1.setName("csp");// 初始化list 并为其加入数据person1.setList(new ArrayList<>());person1.getList().add("aaa");person1.getList().add("bbb");System.out.println("person1:"+person1);//-----------------------------浅拷贝-------------------------------//Person person2 = person1.clone();//-----------------------------深拷贝-------------------------------Person person2 = person1.deepClone();person2.setName("hzw");// 给peron2 中的list添加一条数据person2.getList().add("ccc");System.out.println("person2"+person2);System.out.println("person1:"+person1);boolean flag1 = person1 == person2;System.out.println("person1 和 person2 的 引用地址是否相同: " +  flag1);boolean flag2 = person1.getList() == person2.getList();System.out.println("person1 和 person2 的 list 引用地址是否相同: " +  flag2);
}

输出结果:

空参构造函数调用...
person1:Person{name='csp', age=22, list=[aaa, bbb]}
person2Person{name='hzw', age=22, list=[aaa, bbb, ccc]}
person1:Person{name='csp', age=22, list=[aaa, bbb]}
person1 和 person2 的 引用地址是否相同: false
person1 和 person2 的 list 引用地址是否相同: false

由结果可得出:深拷贝 person2 所得到的 list 内存地址和原来person1 中的内存地址是不同的,深拷贝成功!

关键字:Java中的深拷贝与浅拷贝

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: