栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java中深复制知识点详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java中深复制知识点详解

在正式开始深复制的讲解之前,我们先来理解一下概念。假设一个物品需要批量生产,但是这个物品还配有赠品,生产的时候需要把赠品也列在计划内。所谓深复制的原理就是这样,我们不能只复制属性,包括引用之类的附带也需要被复制。下面小编就为大家带来深复制的两种不同方法。

1.序列化实现

如下为谷歌Gson序列化HashMap,实现深度复制的例子:

public class CopyDeepMapTest {
  public static void main(String[] args) {
    HashMap userMap = new HashMap<>();
    userMap.put(1, new User("jay", 26));
    userMap.put(2, new User("fany", 25));
    //Shallow clone
    Gson gson = new Gson();
    String jsonString = gson.toJson(userMap);
    Type type = new TypeToken>(){}.getType();
    HashMap clonedMap = gson.fromJson(jsonString, type);
    //Same as userMap
    System.out.println(clonedMap);
    System.out.println("nChanges DO NOT reflect in other map n");
    //Change a value is clonedMap
    clonedMap.get(1).setName("test");
    //Verify content of both maps
    System.out.println(userMap);
    System.out.println(clonedMap);
  }
}

运行结果:

{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
Changes DO NOT reflect in other map 
{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}

从运行结果看出,对cloneMap修改,userMap没有被改变,所以是深度复制。

2.list深复制

两个list数据相同但是地址值不同,A和B是独立的两个list,A改变了B不会改变,B改变了A也不会改变

深复制的工具类方法:

public static  List deepCopy(List src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List dest = (List) in.readObject();
return dest;
}

关于深拷贝的一个扩展实例:

public class YuelyLog implements Serializable,Cloneable {
  private Attachment attachment;
  private String name;
  private String date;

  @Override
  protected YuelyLog clone() throws CloneNotSupportedException {
    return (YuelyLog)super.clone();
  }

  public Attachment getAttachment() {
    return attachment;
  }

  public void setAttachment(Attachment attachment) {
    this.attachment = attachment;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getDate() {
    return date;
  }

  public void setDate(String date) {
    this.date = date;
  }

  
  public YuelyLog deepClone() throws IOException,ClassNotFoundException{
    //将对象写入流中
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    objectOutputStream.writeObject(this);
    //从流中取出
    ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
    return (YuelyLog)objectInputStream.readObject();

  }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/129685.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号