成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Java中,如何實現對象的拷貝?

開發 前端
開發中可以使用第三方庫如Apache Commons Lang的SerializationUtils類或Google的Guava庫來實現對象的深拷貝。這些庫提供了更加靈活和方便的深拷貝實現方式,同時也提供了更多的自定義選項和錯誤處理機制。

在Java中,對象的拷貝可以分為淺拷貝(shallow copy)和深拷貝(deep copy)。

  1. 「淺拷貝」:
  • 創建一個新對象,然后將原始對象中的非靜態字段復制到新對象,如果字段是值類型,那么對該字段執行逐位復制。如果字段是引用類型,則復制引用但不復制引用的對象。因此,原始對象及其副本引用同一個對象。
  • 在Java中,我們可以通過實現Cloneable接口并重寫clone()方法來實現淺拷貝。需要注意的是,Object類中的clone()方法是受保護的,所以我們需要在我們的類中將其重寫為public。
  • 另外,如果對象的字段也是需要拷貝的復雜對象,那么可能需要在這些類中也實現Cloneable接口并重寫clone()方法。
  1. 「深拷貝」:
  • 創建一個新對象,然后將原始對象中的非靜態字段復制到新對象。如果字段是值類型,那么對該字段執行逐位復制。如果字段是引用類型,則遞歸地復制該字段引用的對象,而不是只復制引用。

  • 在Java中,深拷貝通常需要我們自己寫代碼來實現,因為Java并沒有提供直接實現深拷貝的內置方法。

  • 深拷貝的一個常見實現方式是使用序列化。我們可以將對象寫入到一個流中,然后再從流中讀取出來,這樣得到的就是原對象的一個深拷貝。但是這種方法有一些限制,比如被拷貝的對象以及它引用的所有對象都必須是可序列化的。

注意:Cloneable接口和clone()方法的設計在Java社區中常常被認為是有缺陷的,因為它們有很多問題,比如Cloneable接口沒有定義任何方法(它是一個標記接口),clone()方法的訪問修飾符是protected,而且它使用的是淺拷貝,這可能會導致意外的對象共享問題。因此,在實際編程中,很多開發者更傾向于自己寫代碼來實現對象的拷貝,而不是使用Cloneable接口和clone()方法。

  1. 通過實現Cloneable接口并重寫clone()方法來實現淺拷貝

我們定一個實體類People,實現了Cloneable接口,并且重寫了clone()方法當然也是直接調用的父類的clone()方法。

public class People implements Cloneable {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

測試拷貝:

public class Main {

    public static void main(String[] args) {
        People people = new People();
        people.setName("Reathin");
        people.setAge(30);

        System.out.println("原People" + people.toString());

        try {
            People people1 = people.clone();
            System.out.println("拷貝People" + people1);
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }

    }
}

輸出結果如下,我們實現了一次淺拷貝。

圖片圖片

  1. 通過將原始對象中的非靜態字段復制到新對象實現深拷貝
People people2 = new People();
people2.setName(people.getName());
people2.setAge(people.getAge());
System.out.println("深拷貝對象1" + people2);
  1. 通過序列化對象流實現深拷貝
// 序列化對象到字節數組
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(people);
byte[] serializedData = byteArrayOutputStream.toByteArray();

// 從字節數組中反序列化對象以創建深拷貝
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serializedData);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
People people3 = (People) objectInputStream.readObject();
System.out.println("深拷貝對象2" + people3);

最終輸出結果如下:

圖片圖片

完整示例代碼:

public class People implements Cloneable, Serializable {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Main {

    public static void main(String[] args) throws IOException, ClassNotFoundException, CloneNotSupportedException {
        People people = new People();
        people.setName("Reathin");
        people.setAge(30);
        System.out.println("原People" + people.toString());

        People people1 = people.clone();
        System.out.println("淺拷貝People" + people1);

        //深拷貝方式一
        People people2 = new People();
        people2.setName(people.getName());
        people2.setAge(people.getAge());
        System.out.println("深拷貝對象1" + people2);

        //深拷貝方式2
        // 序列化對象到字節數組
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(people);
        byte[] serializedData = byteArrayOutputStream.toByteArray();

        // 從字節數組中反序列化對象以創建深拷貝
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serializedData);
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        People people3 = (People) objectInputStream.readObject();
        System.out.println("深拷貝對象2" + people3);

    }
}

開發中可以使用第三方庫如Apache Commons Lang的SerializationUtils類或Google的Guava庫來實現對象的深拷貝。這些庫提供了更加靈活和方便的深拷貝實現方式,同時也提供了更多的自定義選項和錯誤處理機制。


責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2009-07-01 09:17:36

對象比較Java

2021-04-07 10:12:05

Javascript對象拷貝開發

2021-06-03 10:00:47

JavaScript 前端數克隆對象

2025-04-27 09:45:58

JavaScript深拷貝淺拷貝

2018-09-26 14:37:17

JavaScript前端編程語言

2024-09-03 10:06:43

JavaMap項目

2009-05-19 17:28:44

深拷貝淺拷貝clone()

2023-05-05 08:47:35

Java淺拷貝深拷貝

2010-09-08 16:50:11

JavaScriptDOM操作

2022-11-07 11:37:27

深拷貝淺拷貝底層

2020-05-18 10:52:00

前端JavaScript html

2024-08-02 08:43:24

JavaScript開發者工具箱深拷貝

2022-05-16 08:22:37

零拷貝Netty

2020-08-19 08:29:22

JavaScript 對象函數

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2021-11-10 15:18:16

JavaGo命令

2020-10-12 08:35:22

JavaScript

2009-06-30 09:37:02

對象比較Java

2024-04-17 09:01:08

Python深拷貝淺拷貝

2020-12-09 09:33:16

編程語言C語言匯編語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜视频在线观看 | 国产精品久久国产精品久久 | 中文字幕亚洲专区 | 国产剧情久久 | 日韩精品一区二区三区中文字幕 | 一区二区三区 在线 | 草草草草视频 | 人人叉| 成人在线视频免费观看 | 久久国产高清视频 | 日韩av一区二区在线观看 | 精品乱码一区二区 | www在线视频 | 欧美在线视频一区二区 | 视频一区二区中文字幕 | 国产精品久久久精品 | 超碰免费在线 | 97中文视频| 久久视频免费观看 | 成人精品 | 中文字幕一区二区三区精彩视频 | 日韩一二区 | 久久久精品一区二区三区 | 黄色小视频大全 | 亚洲图片视频一区 | 欧美在线观看一区 | 国产一区二区影院 | 久久精品二区亚洲w码 | 欧美精品1区2区3区 免费黄篇 | 伊人爽| 91精品国产一区二区三区香蕉 | 青久草视频 | 福利二区 | 九九亚洲 | 瑟瑟视频在线看 | 在线观看视频中文字幕 | 日韩欧美一二三区 | 一区二区三区四区视频 | 国产一区二区免费在线 | 国产视频线观看永久免费 | 嫩草一区二区三区 |