当前位置 > 主页 > 万和大讲堂 >


Java中的深拷贝与浅拷贝

2015-11-09 11:38

  首先我们看看浅拷贝和深拷贝的定义

 

  浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制

 

  深拷贝:对象,对象内部的引用均复制

 

  为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2

 

  对象A进行浅拷贝后,得到对象B但是对象A1和A2并没有被拷贝

 

  对象A进行深拷贝,得到对象B的同时A1和A2连同它们的引用也被拷贝

 

  在理解了深拷贝和浅拷贝后,我们来看看Java的深拷贝和浅拷贝实现。Java.lang.Object的clone()方法默认是返回一个前拷贝对象。因此如果要用clone()方法实现一个深拷贝,我们必须对每个对象的clone()方法进行特别实现。当对象层次复杂的时候,这样做不但困难而且浪费时间和容易出现错误,特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,你会发现写这个clone()方法真不是一个好的解决方案。

 

  那么除了clone()方法,我们还可以怎么实现呢?答案是序列化,实现步骤和思路是把要拷贝的对象输出成byte array,然后再利用ObjectInputStream转换出新的对象。南京Java培训 下面是代码

 

  public static Object copy(Object oldObj) {

 

  Object obj = null;

 

  try {

 

  // Write the object out to a byte array

 

  ByteArrayOutputStream bos = new ByteArrayOutputStream();

 

  ObjectOutputStream out = new ObjectOutputStream(bos);

 

  out.writeObject(oldObj);

 

  out.flush();

 

  out.close();

 

  // Retrieve an input stream from the byte array and read

 

  // a copy of the object back in.南京Java培训

 

  ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

 

  ObjectInputStream in = new ObjectInputStream(bis);

 

  obj = in.readObject();

 

  } catch (IOException e) {

 

  e.printStackTrace();

 

  } catch (ClassNotFoundException cnfe) {

 

  cnfe.printStackTrace();

 

  }

 

  return obj;


最近开班 more>
  • 全栈开发
  • 软件测试
  • Java大数据开发工程师
  • Web前端开发
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Cloud lab
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCP 19C
  • RHCA-OpenStack
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 双休班
  • 双休班
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 6月28日
  • 6月5日
  • 6月26日
  • 6月27日
  • 6月19日
  • 6月12日
  • 6月5日
  • 随时开课
  • 6月10日
  • 6月4日
  • 6月4日
  • 6月12日
  • 6月26日
  • 6月10日
  • 6月10日
  • 6月4日
  • 7月8日
  • 6月28日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入