最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中深復(fù)制知識點詳解

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

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

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

如下為谷歌Gson序列化HashMap,實現(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);
  }
}

運行結(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}}

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

2.list深復(fù)制

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

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

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)于深拷貝的一個擴展實例:

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ù)實現(xiàn)深拷貝
   * @return
   */
  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();

  }
}

相關(guān)文章

  • java使用iterator遍歷指定目錄示例分享

    java使用iterator遍歷指定目錄示例分享

    這篇文章主要介紹了java使用iterator遍歷指定目錄示例,需要的朋友可以參考下
    2014-04-04
  • Spring Boot快速實現(xiàn) IP地址解析的示例詳解

    Spring Boot快速實現(xiàn) IP地址解析的示例詳解

    這篇文章主要介紹了Spring Boot快速實現(xiàn)IP地址解析,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Spring Boot緩存實戰(zhàn) Caffeine示例

    Spring Boot緩存實戰(zhàn) Caffeine示例

    本篇文章主要介紹了Spring Boot緩存實戰(zhàn) Caffeine示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java Volatile關(guān)鍵字實現(xiàn)原理過程解析

    Java Volatile關(guān)鍵字實現(xiàn)原理過程解析

    這篇文章主要介紹了Java Volatile關(guān)鍵字實現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot整合Druid數(shù)據(jù)庫連接池的方法

    SpringBoot整合Druid數(shù)據(jù)庫連接池的方法

    Druid是Java語言中最好的數(shù)據(jù)庫連接池。Druid能夠提供強大的監(jiān)控和擴展功能。這篇文章主要介紹了SpringBoot整合Druid數(shù)據(jù)庫連接池的方法,需要的朋友可以參考下
    2020-07-07
  • 了解java中對象基礎(chǔ)Object類

    了解java中對象基礎(chǔ)Object類

    本文主要講解了java中對象基礎(chǔ)Object類,文中運用大量代碼講解的非常詳細(xì),想學(xué)習(xí)相關(guān)知識的小伙伴可以參考一下這篇文章
    2021-09-09
  • MyBatis?Mapper映射器的具體用法

    MyBatis?Mapper映射器的具體用法

    映射器是MyBatis中最重要的文件,映射器由Java接口和XML文件共同組成,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 淺談springfox-swagger原理解析與使用過程中遇到的坑

    淺談springfox-swagger原理解析與使用過程中遇到的坑

    本篇文章主要介紹了淺談springfox-swagger原理解析與使用過程中遇到的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • SpringBoot集成redis的示例代碼

    SpringBoot集成redis的示例代碼

    redis想必小伙伴們即使沒有用過,也是經(jīng)常聽到的,在工作中,redis用到的頻率非常高,本文主要介紹了SpringBoot集成redis,感興趣的可以參考一下
    2021-10-10
  • JAVA如何獲取jvm和操作系統(tǒng)相關(guān)信息

    JAVA如何獲取jvm和操作系統(tǒng)相關(guān)信息

    這篇文章主要介紹了JAVA獲取jvm和操作系統(tǒng)相關(guān)信息,使用Java自帶的類進行獲取系統(tǒng)運行的相關(guān)信息,在這整理記錄分享一下,需要的朋友可以參考下
    2022-10-10

最新評論

舞钢市| 探索| 定兴县| 治多县| 高台县| 宁乡县| 霍邱县| 韩城市| 顺义区| 武汉市| 康平县| 盐边县| 邢台县| 萝北县| 崇阳县| 石渠县| 西吉县| 新巴尔虎左旗| 南京市| 双城市| 老河口市| 五寨县| 宁城县| 新泰市| 福泉市| 兴义市| 巴南区| 怀化市| 新蔡县| 大冶市| 赤城县| 务川| 灵台县| 漳浦县| 仙游县| 蒙阴县| 凌海市| 临汾市| 遵义市| 老河口市| 昌平区|