欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java深度復(fù)制功能與用法實(shí)例分析

 更新時(shí)間:2018年01月02日 10:49:30   作者:PursueCloud  
這篇文章主要介紹了Java深度復(fù)制功能與用法,簡(jiǎn)單講述了深度復(fù)制的概念、功能并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)深度復(fù)制的具體操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Java深度復(fù)制功能與用法。分享給大家供大家參考,具體如下:

寫在前面:

什么是深度復(fù)制?在Java里面,在創(chuàng)建一個(gè)對(duì)象,我們通常會(huì)有一個(gè)引用指向該對(duì)象,當(dāng)我們通過引用變量改變對(duì)象的值(屬性)時(shí),引用是不變的,變的是內(nèi)存里面的那塊內(nèi)存,即引用所指向的對(duì)象。一般情況下,我們將該引用賦給另一個(gè)引用變量或者作為參數(shù)傳遞時(shí),傳遞的也只是引用,即將引用指向“復(fù)制”了一份給另一個(gè)引用變量,隨后該引用變量也指向同一個(gè)對(duì)象,內(nèi)存里面并沒有創(chuàng)建一個(gè)新的對(duì)象。在某些情況下,我們需要“真正復(fù)制”對(duì)象,創(chuàng)建一份已知對(duì)象的copy,而不僅僅“復(fù)制”引用,用作備份也好,其他操作也好。

那么,該如何實(shí)現(xiàn)?

先說下思路:首先將對(duì)象序列化到流里,然后再反序列化,從流里讀取出來即可。

下面上代碼:

package com.yo.java;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * Java 實(shí)現(xiàn)深度復(fù)制
 * @author Yo
 *
 */
public class DeepCopy implements Serializable{
  int i;
  /**
   * @param args
   * @throws IOException
   * @throws ClassNotFoundException
   */
  public static void main(String[] args) throws ClassNotFoundException, IOException {
    demo1();
    demo2();
  }
  /**
   * 深度復(fù)制,實(shí)參類必須實(shí)現(xiàn)Serializable接口
   * @param o
   * @return
   * @throws IOException
   * @throws ClassNotFoundException
   */
  public static Object deepCopy(Object o) throws IOException, ClassNotFoundException {
//   //先序列化,寫入到流里
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream oo = new ObjectOutputStream(bo);
    oo.writeObject(o);
    //然后反序列化,從流里讀取出來,即完成復(fù)制
    ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
    ObjectInputStream oi = new ObjectInputStream(bi);
    return oi.readObject();
  }
  /**
   * 引用傳遞與深度復(fù)制
   * @throws ClassNotFoundException
   * @throws IOException
   */
  public static void demo1() throws ClassNotFoundException, IOException {
    System.out.println("===========未使用深度復(fù)制=========");
    DeepCopy dc1 = new DeepCopy();
    dc1.i = 1;//初始化dc1里i的值
    DeepCopy dc2 = dc1;
    dc1.i = 2;//改變dc1里i的值
    System.out.println("dc1 : " + dc1.i);
    System.out.println("dc2(引用傳遞) : " + dc2.i);
    System.out.println("===========使用深度復(fù)制=========");
    DeepCopy dc3 = new DeepCopy();
    dc3.i = 1;//初始化dc3里i的值
    DeepCopy dc4 = (DeepCopy)deepCopy(dc3);
    dc3.i = 2;//改變dc3里i的值
    System.out.println("dc3 : " + dc3.i);
    System.out.println("dc4(深度復(fù)制) : " + dc4.i);
  }
  /**
   * 集合的值復(fù)制與深度復(fù)制
   * @throws ClassNotFoundException
   * @throws IOException
   */
  public static void demo2() throws ClassNotFoundException, IOException {
    System.out.println("===========未使用深度復(fù)制=========");
    //創(chuàng)建DeepCopy對(duì)象,并初始化i的值,添加到list1集合
    DeepCopy dc = new DeepCopy();
    dc.i = 1;//初始化dc1里i的值
    List<DeepCopy> list1 = new ArrayList<DeepCopy>();
    list1.add(dc);
    //未使用深度復(fù)制
    List<DeepCopy> list2 = new ArrayList<DeepCopy>(list1);//這里與使用Collections.copy(dest, src)結(jié)果一樣
    //改變list1中元素的值
    for(DeepCopy d1 : list1) {
      //改變dc1里i的值
      d1.i = 2;
    }
    //遍歷list
    for(DeepCopy d1 : list1) {
      System.out.println("list1 : " + d1.i);
    }
    //遍歷list2
    for(DeepCopy d2 : list2) {
      System.out.println("list2(復(fù)制) : " + d2.i);
    }
    System.out.println("===========使用深度復(fù)制后=========");
    DeepCopy dc3 = new DeepCopy();
    dc3.i = 1;//初始化dc3里i的值
    List<DeepCopy> list3 = new ArrayList<DeepCopy>();
    list3.add(dc3);
    List<DeepCopy> list4 = (List<DeepCopy>) deepCopy(list3);
    for(DeepCopy d : list3) {
      //改變dc3里i的值
      d.i = 2;
    }
    for(DeepCopy d3 : list3) {
      System.out.println("list3 : " + d3.i);
    }
    for(DeepCopy d4 : list4) {
      System.out.println("list4(深度復(fù)制): " + d4.i);
    }
  }
}

以上運(yùn)行結(jié)果如下(實(shí)測(cè)):

===========未使用深度復(fù)制=========
dc1 : 2
dc2(引用傳遞) : 2
===========使用深度復(fù)制=========
dc3 : 2
dc4(深度復(fù)制) : 1
===========未使用深度復(fù)制=========
list1 : 2
list2(復(fù)制) : 2
===========使用深度復(fù)制后=========
list3 : 2
list4(深度復(fù)制): 1

由此可見,當(dāng)僅僅只是引用傳遞或者根據(jù)對(duì)象的值創(chuàng)建新的值,僅能稱為“淺復(fù)制”,當(dāng)原對(duì)象的屬性發(fā)生改變時(shí),根據(jù)上面方式創(chuàng)建的新對(duì)象的屬性也會(huì)隨之改變;而如果采用深度復(fù)制,那是真正的copy了一份新的對(duì)象,新對(duì)象的與原對(duì)象不存在任何關(guān)聯(lián),原對(duì)象的屬性發(fā)生改變不會(huì)影響新對(duì)象,就如同copy的意義一樣

如上,如有不妥,如能指出,非常感謝

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java8實(shí)現(xiàn)任意參數(shù)的鏈棧

    Java8實(shí)現(xiàn)任意參數(shù)的鏈棧

    這篇文章主要為大家詳細(xì)介紹了Java8實(shí)現(xiàn)任意參數(shù)的鏈棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • IntelliJ IDEA 2019.2 x64的安裝、應(yīng)用與簡(jiǎn)單配置(圖文)

    IntelliJ IDEA 2019.2 x64的安裝、應(yīng)用與簡(jiǎn)單配置(圖文)

    這篇文章主要介紹了IntelliJ IDEA 2019.2 x64的安裝、應(yīng)用與簡(jiǎn)單配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 詳解spring cloud分布式日志鏈路跟蹤

    詳解spring cloud分布式日志鏈路跟蹤

    這篇文章主要介紹了詳解spring cloud分布式日志鏈路跟蹤,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java volatile的適用場(chǎng)景實(shí)例詳解

    Java volatile的適用場(chǎng)景實(shí)例詳解

    在本文里我們給大家整理了一篇關(guān)于Java volatile的適用場(chǎng)景實(shí)例內(nèi)容和知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2019-08-08
  • SSH框架的常見問題和解決方法

    SSH框架的常見問題和解決方法

    SSH框架的常見問題和解決方法,需要的朋友可以參考一下
    2013-02-02
  • Java遍歷輸出指定目錄、樹形結(jié)構(gòu)所有文件包括子目錄下的文件

    Java遍歷輸出指定目錄、樹形結(jié)構(gòu)所有文件包括子目錄下的文件

    這篇文章主要介紹了Java遍歷輸出指定目錄、樹形結(jié)構(gòu)下的所有文件包括子目錄中的文件,需要的朋友可以參考下
    2015-07-07
  • Java泛型之上界下界通配符詳解

    Java泛型之上界下界通配符詳解

    這篇文章主要介紹了Java泛型之上界下界通配符詳解,學(xué)習(xí)使用泛型編程時(shí),更令人困惑的一個(gè)方面是確定何時(shí)使用上限有界通配符以及何時(shí)使用下限有界通配符。本文提供一些設(shè)計(jì)代碼時(shí)要遵循的一些準(zhǔn)則。,需要的朋友可以參考下
    2019-06-06
  • SpringBoot 使用 Ehcache 作為緩存的操作方法

    SpringBoot 使用 Ehcache 作為緩存的操作方法

    這篇文章主要介紹了SpringBoot 如何使用 Ehcache 作為緩存,我們通過添加 Ehcache 依賴、創(chuàng)建 Ehcache 配置文件并在 Spring Boot 應(yīng)用程序的配置文件中啟用 Ehcache 緩存,來配置 Ehcache 緩存,需要的朋友可以參考下
    2023-06-06
  • SpringBoot自定義starter實(shí)例代碼

    SpringBoot自定義starter實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot自定義starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • spring使用ehcache實(shí)現(xiàn)頁面緩存示例

    spring使用ehcache實(shí)現(xiàn)頁面緩存示例

    這篇文章主要介紹了spring使用ehcache實(shí)現(xiàn)頁面緩存示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02

最新評(píng)論