全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java对象深复制与浅复制实例详解

 Java对象深复制与浅复制实例详解

我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对象的复制一般有两种方式,深复制和浅复制

浅复制:对象的复制仅是对象本身,对象引用的其它对方并不会复制。

深复制:对象的复制包含对象引用的对象。

Java所有对象的基类提供了clone方法,但是这个方法是protected native修饰,因此只暴露给之类去重写,外部是无法直接调用的。

我们现在来测试两种复制,首选是浅复制,浅复制要实现Cloneable接口。

// 课程对象
class Class {
  private String name;

  public String getName() {
    return name;
  }

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

}
// 学生对象
class User implements Cloneable {
  private String name;
  private Long id;
  // 课程引用
  private Class c;

  public Class getC() {
    return c;
  }

  public void setC(Class c) {
    this.c = c;
  }

  public String getName() {
    return name;
  }

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

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

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

  @Override
  public int hashCode() {
    return super.hashCode();
  }

  @Override
  public boolean equals(Object obj) {

    if (obj instanceof User) {
      User user = (User) obj;
      if (this.id == user.getId() && this.getName() == user.getName()) {
        return true;
      }
      if (user.getId().equals(this.id)
          && user.getName().equals(this.name)) {
        return true;
      }
      return false;
    } else
      return false;
  }

}

我们来测试:

 User user1 = new User();
    User user2 = user1;

    User user3 = (User) user1.clone();

    System.out.println(user1 == user2);
    System.out.println(user3 == user1);
    System.out.println(user3.equals(user1));
    System.out.println(user3.getName() == user3.getName());// true,浅复制

    Class c = new Class();
    c.setName("语文");
    user1.setC(c);
    // 测试复制深度
    User user4 = (User) user1.clone();
    System.out.println(user4.getC() == user1.getC()); // true,说明引用的对象依然是同一个对象

对象的复制并没复制引用所指向的对象class,复制出来的引用指向的同一个地址。

深复制采用序列化与反序列的方式去获取,也有种说法类似于腌菜,用流的方式腌制进去又取出来,实现深度复制。

class Car implements Serializable {
  /**
   * 
   */
  private static final long serialVersionUID = 42342L;
  private String name;

  public String getName() {
    return name;
  }

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

}

// 深复制
class People implements Serializable{
  /**
   * 
   */
  private static final long serialVersionUID = 543535212412L;
  private Car car;

  public Car getCar() {
    return car;
  }

  public void setCar(Car car) {
    this.car = car;
  }

  public People deepClone() throws IOException, ClassNotFoundException {
    // 腌制
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(out);
    oos.writeObject(this);
    // 取出
    ByteArrayInputStream input = new ByteArrayInputStream(out.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(input);
    return (People) ois.readObject();
  }

}

测试深复制:

// 深复制
    Car car = new Car();
    car.setName("benz");
    People p = new People();
    p.setCar(car);

    try {
      People p2 = p.deepClone();
      System.out.println(p2.getCar() == p.getCar()); // false,说明引用的对象也进行了复制
    } catch (ClassNotFoundException | IOException e) {
      e.printStackTrace();
    }

例外提及一下生成对象的五种办法:

1.new
2.Class类的newInstance
3.Constructor类newInstance
4.Clone方式
5.反序列化的方式

其中2与3即是反射的方式。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java对象深复制与浅复制  # java  # 对象复制  # 利用Java反射机制实现对象相同字段的复制操作  # Java对象的复制三种方式(小结)  # Java编程实现对象克隆(复制)代码详解  # Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍  # 深入java对象复制的分析  # Java基础之面向对象机制(多态、继承)底层实现  # Java MapStruct解了对象映射的毒  # 详解Java对象的内存布局  # Java基础详解之面向对象的那些事儿  # 深入理解Java对象复制  # 两种  # 希望能  # 仅是  # 重写  # 我们现在  # 即是  # 有两种  # 谢谢大家  # 类似于  # 五种  # 进行了  # 化与  # 直接调用  # 序列化  # Override  # Object  # getId  # implements  # setC  # getC 


相关文章: 如何选择可靠的免备案建站服务器?  如何高效搭建专业期货交易平台网站?  如何安全更换建站之星模板并保留数据?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  如何在IIS中新建站点并配置端口与IP地址?  网站图片在线制作软件,怎么在图片上做链接?  学校建站服务器如何选型才能满足性能需求?  制作营销网站公司,淘特是干什么用的?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  深圳网站制作平台,深圳市做网站好的公司有哪些?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  javascript基本数据类型及类型检测常用方法小结  *服务器网站为何频现安全漏洞?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何快速搭建二级域名独立网站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何在IIS中新建站点并配置端口与物理路径?  建站主机服务器选型指南与性能优化方案解析  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  C++中引用和指针有什么区别?(代码说明)  公司门户网站制作流程,华为官网怎么做?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何在阿里云部署织梦网站?  教学网站制作软件,学习*后期制作的网站有哪些?  网站制作难吗安全吗,做一个网站需要多久时间?  独立制作一个网站多少钱,建立网站需要花多少钱?  如何制作算命网站,怎么注册算命网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  宝塔面板创建网站无法访问?如何快速排查修复?  建站之星后台管理:高效配置与模板优化提升用户体验  网站app免费制作软件,能免费看各大网站视频的手机app?  开封网站制作公司,网络用语开封是什么意思?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何在IIS服务器上快速部署高效网站?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  北京网站制作网页,网站升级改版需要多久?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  湖北网站制作公司有哪些,湖北清能集团官网?  建站之星客服服务时间及联系方式如何?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  香港服务器选型指南:免备案配置与高效建站方案解析  linux top下的 minerd 木马清除方法  如何选择香港主机高效搭建外贸独立站?  建站之星如何助力网站排名飙升?揭秘高效技巧  济南专业网站制作公司,济南信息工程学校怎么样?  如何在IIS7中新建站点?详细步骤解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。