亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中深復(fù)制知識(shí)點(diǎn)詳解

 更新時(shí)間:2020年12月27日 10:13:05   作者:小妮淺淺  
在本篇文章里小編給大家整理了關(guān)于java中深復(fù)制知識(shí)點(diǎn)詳解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。

在正式開(kāi)始深復(fù)制的講解之前,我們先來(lái)理解一下概念。假設(shè)一個(gè)物品需要批量生產(chǎn),但是這個(gè)物品還配有贈(zèng)品,生產(chǎn)的時(shí)候需要把贈(zèng)品也列在計(jì)劃內(nèi)。所謂深復(fù)制的原理就是這樣,我們不能只復(fù)制屬性,包括引用之類(lèi)的附帶也需要被復(fù)制。下面小編就為大家?guī)?lái)深復(fù)制的兩種不同方法。

1.序列化實(shí)現(xiàn)

如下為谷歌Gson序列化HashMap,實(shí)現(xiàn)深度復(fù)制的例子:

public class CopyDeepMapTest {
  public static void main(String[] args) {
    HashMap<Integer, User> 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<HashMap<Integer, User>>(){}.getType();
    HashMap<Integer, User> 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);
  }
}

運(yùn)行結(jié)果:

{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}}

從運(yùn)行結(jié)果看出,對(duì)cloneMap修改,userMap沒(méi)有被改變,所以是深度復(fù)制。

2.list深復(fù)制

兩個(gè)list數(shù)據(jù)相同但是地址值不同,A和B是獨(dú)立的兩個(gè)list,A改變了B不會(huì)改變,B改變了A也不會(huì)改變

深復(fù)制的工具類(lèi)方法:

public static <T> List<T> deepCopy(List<T> 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<T> dest = (List<T>) in.readObject();
return dest;
}

關(guān)于深拷貝的一個(gè)擴(kuò)展實(shí)例:

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;
  }

  /**
   * 使用序列化技術(shù)實(shí)現(xiàn)深拷貝
   * @return
   */
  public YuelyLog deepClone() throws IOException,ClassNotFoundException{
    //將對(duì)象寫(xiě)入流中
    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();

  }
}

相關(guān)文章

  • 詳解Mybatis是如何解析配置文件的

    詳解Mybatis是如何解析配置文件的

    這篇文章主要介紹了詳解Mybatis是如何解析配置文件的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringBoot整合Redis實(shí)現(xiàn)緩存分頁(yè)數(shù)據(jù)查詢(xún)功能

    SpringBoot整合Redis實(shí)現(xiàn)緩存分頁(yè)數(shù)據(jù)查詢(xún)功能

    類(lèi)似淘寶首頁(yè),這些商品是從數(shù)據(jù)庫(kù)中查出來(lái)的嗎,答案肯定不是,本文我們就通過(guò)一個(gè)案例實(shí)操一下,首頁(yè)熱點(diǎn)數(shù)據(jù)怎么放到Redis中去查詢(xún),感興趣的同學(xué)可以參考一下
    2023-06-06
  • Java連接數(shù)據(jù)庫(kù)oracle中文亂碼解決方案

    Java連接數(shù)據(jù)庫(kù)oracle中文亂碼解決方案

    這篇文章主要介紹了Java連接數(shù)據(jù)庫(kù)oracle中文亂碼解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java實(shí)例講解注解的應(yīng)用

    Java實(shí)例講解注解的應(yīng)用

    JAVA注解?Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴(lài)性,甚至執(zhí)行基本編譯時(shí)檢查。注解是以‘@注解名’在代碼中存在的
    2022-06-06
  • Java CAS操作與Unsafe類(lèi)詳解

    Java CAS操作與Unsafe類(lèi)詳解

    這篇文章主要介紹了Java CAS操作與Unsafe類(lèi)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • SpringBoot中application.properties、application.yaml、application.yml區(qū)別

    SpringBoot中application.properties、application.yaml、applicati

    本文主要介紹了SpringBoot中application.properties、application.yaml、application.yml區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • 詳解Java中String,StringBuffer和StringBuilder的使用

    詳解Java中String,StringBuffer和StringBuilder的使用

    這篇文章主要為大家詳細(xì)介紹了Java中String,StringBuffer和StringBuilder三者的區(qū)別以及使用,文中的少了講解詳細(xì),感興趣的可以了解一下
    2022-07-07
  • 解決mybatis映射mapper.xml文件不編譯的問(wèn)題

    解決mybatis映射mapper.xml文件不編譯的問(wèn)題

    這篇文章主要介紹了解決mybatis映射mapper.xml文件不編譯的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 不同方式遍歷Map集合(全)

    不同方式遍歷Map集合(全)

    大家都知道Map是一種以鍵值對(duì)的形式存在的集合,其中每個(gè)鍵映射到一個(gè)值,下面把Map遍歷集合總結(jié)了一下給大家分享下,需要的朋友可以參考下
    2015-07-07
  • java中的Integer的toBinaryString()方法實(shí)例

    java中的Integer的toBinaryString()方法實(shí)例

    這篇文章主要介紹了java中的Integer的toBinaryString()方法實(shí)例,有需要的朋友可以參考一下
    2013-12-12

最新評(píng)論