国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Java深度復制功能與用法實例分析

2024-07-13 10:15:47
字體:
來源:轉載
供稿:網友

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

寫在前面:

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

那么,該如何實現?

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

下面上代碼:

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 實現深度復制 * @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();  }  /**   * 深度復制,實參類必須實現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);    //然后反序列化,從流里讀取出來,即完成復制    ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());    ObjectInputStream oi = new ObjectInputStream(bi);    return oi.readObject();  }  /**   * 引用傳遞與深度復制   * @throws ClassNotFoundException   * @throws IOException   */  public static void demo1() throws ClassNotFoundException, IOException {    System.out.println("===========未使用深度復制=========");    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("===========使用深度復制=========");    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(深度復制) : " + dc4.i);  }  /**   * 集合的值復制與深度復制   * @throws ClassNotFoundException   * @throws IOException   */  public static void demo2() throws ClassNotFoundException, IOException {    System.out.println("===========未使用深度復制=========");    //創建DeepCopy對象,并初始化i的值,添加到list1集合    DeepCopy dc = new DeepCopy();    dc.i = 1;//初始化dc1里i的值    List<DeepCopy> list1 = new ArrayList<DeepCopy>();    list1.add(dc);    //未使用深度復制    List<DeepCopy> list2 = new ArrayList<DeepCopy>(list1);//這里與使用Collections.copy(dest, src)結果一樣    //改變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(復制) : " + d2.i);    }    System.out.println("===========使用深度復制后=========");    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(深度復制): " + d4.i);    }  }}

以上運行結果如下(實測):

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

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

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

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝清县| 泰来县| 汾阳市| 永德县| 麟游县| 长丰县| 永泰县| 万荣县| 沙雅县| 平乐县| 大荔县| 永济市| 广德县| 当雄县| 嘉黎县| 青冈县| 黔西县| 乌兰察布市| 大港区| 施甸县| 伊金霍洛旗| 揭西县| 宁河县| 江华| 荃湾区| 东平县| 登封市| 城固县| 韶关市| 会理县| 德州市| 龙胜| 阳西县| 馆陶县| 天等县| 桃园县| 榆中县| 镇远县| 禹城市| 奉化市| 东乡|