zoukankan      html  css  js  c++  java
  • Java 浅复制和深复制

    概念

    浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

    深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

    例子

     1 import java.io.ByteArrayInputStream;
     2 import java.io.ByteArrayOutputStream;
     3 import java.io.IOException;
     4 import java.io.ObjectInputStream;
     5 import java.io.ObjectOutputStream;
     6 import java.io.Serializable;
     7 
     8 public class Prototype {
     9     private static final long serialVersionUID = 1L;
    10     private String string;
    11 
    12     private SerializableObject obj;
    13 
    14     /* 浅复制 */
    15     public Object clone() throws CloneNotSupportedException {
    16         Prototype proto = (Prototype) super.clone();
    17         return proto;
    18     }
    19 
    20     /* 深复制 */
    21     public Object deepClone() throws IOException, ClassNotFoundException {
    22 
    23         /* 写入当前对象的二进制流 */
    24         ByteArrayOutputStream bos = new ByteArrayOutputStream();
    25         ObjectOutputStream oos = new ObjectOutputStream(bos);
    26         oos.writeObject(this);
    27 
    28         /* 读出二进制流产生的新对象 */
    29         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    30         ObjectInputStream ois = new ObjectInputStream(bis);
    31         return ois.readObject();
    32     }
    33 
    34     public String getString() {
    35         return string;
    36     }
    37 
    38     public void setString(String string) {
    39         this.string = string;
    40     }
    41 
    42     public SerializableObject getObj() {
    43         return obj;
    44     }
    45 
    46     public void setObj(SerializableObject obj) {
    47         this.obj = obj;
    48     }
    49 }
    50 
    51 
    52 class SerializableObject implements Serializable {
    53     private static final long serialVersionUID = 1L;
    54 }

    要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。

    参考资料

  • 相关阅读:
    发送邮件时,报错:AttributeError: 'list' object has no attribute 'encode'
    快速统计字符出现次数
    vscode快捷键
    win7系统部署django项目
    记录一个小问题,django+Apache+win7,启动Apache后,打开网页,一直转圈圈,停不下来
    django ORM 按月分组统计
    哈希表的应用
    查找算法
    递归的应用
    递归
  • 原文地址:https://www.cnblogs.com/yuxiaoqi/p/4789442.html
Copyright © 2011-2022 走看看