当前位置: 首页 > news >正文

浅复制和深复制

浅复制:

   结论:clone 方法
内存地址不一致,克隆的对象和原来的对象已经是两个不同的对象 基本类型 :原来的对象 和 clone的对象 已经完全互不影响 引用类型: 还是共享一个内存地址,所以一个改变,另一个还是会跟着改变 String:String是应用类型,但是因为是不变类,所以也不会有影响
package com.hella.thread.pattern.protoType;

import java.util.ArrayList;

public class ProtoType implements Cloneable {

    private String id;

    private int age;

    private boolean married;
    
    private ArrayList<Hobby> dd = new ArrayList<>();

    private Hobby hobby;

    public String getId() {
        return id;
    }

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

    public int getAge() {
        return age;
    }

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

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }

    public Hobby getHobby() {
        return hobby;
    }

    public void setHobby(Hobby hobby) {
        this.hobby = hobby;
    }

    @Override
    protected ProtoType clone() throws CloneNotSupportedException {
        //默认浅克隆
        ProtoType ProtoType = (ProtoType)super.clone();
        return ProtoType;
    }

}

class Hobby{

    private int hid;

    private String name;

    public int getHid() {
        return hid;
    }

    public void setHid(int hid) {
        this.hid = hid;
    }

    public String getName() {
        return name;
    }

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

测试:

public class App {
    public static void main(String[] args) throws Exception {
        ProtoType pType = new ProtoType();
        pType.setId("1"); // String 类型
        pType.setAge(20); // 基本数据类型
        pType.setMarried(false);// 基本数据类型
        Hobby hobby = new Hobby(); // 引用类型
        hobby.setHid(100);
        hobby.setName("basketball");
        pType.setHobby(hobby);
        
        System.out.println("==================原来对象=============================================");
        // 打印内存地址
        System.out.println(pType.hashCode()); // 366712642
        System.out.println(pType.getId()); // 1
        System.out.println(pType.getAge()); // 20
        System.out.println(pType.isMarried()); // false
        System.out.println(pType.getHobby().hashCode()); // 1829164700
        System.out.println(pType.getHobby().getHid()); // 100
        System.out.println(pType.getHobby().getName()); // basketball
        System.out.println("====================对象克隆===========================================");
        // clone
        ProtoType pTypeClone = pType.clone();
        System.out.println(pTypeClone.hashCode()); // 2018699554
        System.out.println(pTypeClone.getId()); // 1
        System.out.println(pTypeClone.getAge()); // 20
        System.out.println(pTypeClone.isMarried()); // false
        System.out.println(pTypeClone.getHobby().hashCode()); // 1829164700
        System.out.println(pTypeClone.getHobby().getHid()); // 100
        System.out.println(pTypeClone.getHobby().getName()); // basketball
        
        // 根据 pType和 pTypeClone 对比,发现内存地址不一样,说明 两个是不同的对象
        
        //更改复制过来的对象
        pTypeClone.setId("2");
        pTypeClone.setAge(30);
        pTypeClone.setMarried(true);
        pTypeClone.getHobby().setHid(200);
        pTypeClone.getHobby().setName("football");
        
        // clone对象重新设置
        System.out.println("=====================克隆对象重新设置后==========================================");
        System.out.println(pTypeClone.hashCode()); // 2018699554
        System.out.println(pTypeClone.getId()); // 2
        System.out.println(pTypeClone.getAge()); // 30
        System.out.println(pTypeClone.isMarried()); // true
        System.out.println(pTypeClone.getHobby().hashCode()); // 1829164700   浅克隆 引用类型内存中的地址没有变 一个改变,另一个也会相应的变化
        System.out.println(pTypeClone.getHobby().getHid()); // 200
        System.out.println(pTypeClone.getHobby().getName()); // football
        
        
        System.out.println("========================对来对象=======================================");
        //查看原来对象
        System.out.println(pType.hashCode()); // 366712642
        System.out.println(pType.getId()); // 1
        System.out.println(pType.getAge()); // 20
        System.out.println(pType.isMarried()); // false
        System.out.println(pType.getHobby().hashCode()); // 1829164700
        System.out.println(pType.getHobby().getHid()); // 200
        System.out.println(pType.getHobby().getName()); // football
        
        //原对象的引用类型的数据已经变类
        /*
         * 结论:clone 方法
         * 基本类型 :原来的对象 和 clone的对象 已经完全互不影响
         * 引用类型: 还是共享一个内存地址,所以一个改变,另一个还是会跟着改变
         * String:String是应用类型,但是因为是不变类,所以也不会有影响
         * 
         */

    }

}

 

深复制实现方式一:引用类型也分别clone

public class ProtoType implements Cloneable {

    private String id;

    private int age;

    private boolean married;
    
    private ArrayList<Hobby> dd = new ArrayList<>();

    private Hobby hobby;

    public String getId() {
        return id;
    }

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

    public int getAge() {
        return age;
    }

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

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }

    public Hobby getHobby() {
        return hobby;
    }

    public void setHobby(Hobby hobby) {
        this.hobby = hobby;
    }

    @Override
    protected ProtoType clone() throws CloneNotSupportedException {
        //默认浅克隆
        ProtoType ProtoType = (ProtoType)super.clone();
        //深复制
        Hobby clone = this.hobby.clone();
        ProtoType.hobby = clone;
        return ProtoType;
    }

}

class Hobby implements Cloneable{

    private int hid;

    private String name;

    public int getHid() {
        return hid;
    }

    public void setHid(int hid) {
        this.hid = hid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Override
    protected Hobby clone() throws CloneNotSupportedException {
        return (Hobby)super.clone();
    }
}

 

public class App {
    public static void main(String[] args) throws Exception {
        ProtoType pType = new ProtoType();
        pType.setId("1"); // String 类型
        pType.setAge(20); // 基本数据类型
        pType.setMarried(false);// 基本数据类型
        Hobby hobby = new Hobby(); // 引用类型
        hobby.setHid(100);
        hobby.setName("basketball");
        pType.setHobby(hobby);
        
        System.out.println("==================原来对象=============================================");
        // 打印内存地址
        System.out.println(pType.hashCode()); // 366712642
        System.out.println(pType.getId()); // 1
        System.out.println(pType.getAge()); // 20
        System.out.println(pType.isMarried()); // false
        System.out.println(pType.getHobby().hashCode()); // 1829164700
        System.out.println(pType.getHobby().getHid()); // 100
        System.out.println(pType.getHobby().getName()); // basketball
        System.out.println("====================对象克隆===========================================");
        // clone
        ProtoType pTypeClone = pType.clone();
        System.out.println(pTypeClone.hashCode()); // 2018699554
        System.out.println(pTypeClone.getId()); // 1
        System.out.println(pTypeClone.getAge()); // 20
        System.out.println(pTypeClone.isMarried()); // false
        System.out.println(pTypeClone.getHobby().hashCode()); // 1311053135
        System.out.println(pTypeClone.getHobby().getHid()); // 100
        System.out.println(pTypeClone.getHobby().getName()); // basketball
        
        // 根据 pType和 pTypeClone 对比,发现内存地址不一样,说明 两个是不同的对象
        
        //更改复制过来的对象
        pTypeClone.setId("2");
        pTypeClone.setAge(30);
        pTypeClone.setMarried(true);
        pTypeClone.getHobby().setHid(200);
        pTypeClone.getHobby().setName("football");
        
        // clone对象重新设置
        System.out.println("=====================克隆对象重新设置后==========================================");
        System.out.println(pTypeClone.hashCode()); // 2018699554
        System.out.println(pTypeClone.getId()); // 2
        System.out.println(pTypeClone.getAge()); // 30
        System.out.println(pTypeClone.isMarried()); // true
        System.out.println(pTypeClone.getHobby().hashCode()); // 1311053135    引用类型深克隆之后内存中重新分配地址
        System.out.println(pTypeClone.getHobby().getHid()); // 200
        System.out.println(pTypeClone.getHobby().getName()); // football
        
        
        System.out.println("========================对来对象=======================================");
        //查看原来对象
        System.out.println(pType.hashCode()); // 366712642
        System.out.println(pType.getId()); // 1
        System.out.println(pType.getAge()); // 20
        System.out.println(pType.isMarried()); // false
        System.out.println(pType.getHobby().hashCode()); // 1829164700
        System.out.println(pType.getHobby().getHid()); // 200
        System.out.println(pType.getHobby().getName()); // football
        
        //原对象的引用类型的数据已经变类
        /*
         * 结论:clone 方法
         * 基本类型 :原来的对象 和 clone的对象 已经完全互不影响
         * 引用类型: 还是共享一个内存地址,所以一个改变,另一个还是会跟着改变
         * String:String是应用类型,但是因为是不变类,所以也不会有影响
         * 
         */

    }

}

 深复制实现方式二: 对象实现Serializable 接口,对象里面的对象也必须实现Serializable 

 

public class App {
    public static void main(String[] args) throws Exception {
        ProtoType protoType = new ProtoType();
        Hobby hobby = new Hobby();
        hobby.setId(1);
        hobby.setName("basketball");
        protoType.setUsername("Chris");
        protoType.setHobby(hobby);
        System.out.println(protoType.hashCode()); //366712642
        System.out.println(protoType.getHobby().hashCode()); //1829164700

        File file = new File("C:\\Users\\caich5\\Desktop\\a.txt");
        OutputStream outputStream = new FileOutputStream(file);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(protoType);// 366712642
        objectOutputStream.close();

        InputStream inputStream = new FileInputStream(file);
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        ProtoType protoTyleClone = (ProtoType) objectInputStream.readObject();
        objectInputStream.close();

        System.out.println(protoTyleClone.hashCode()); // 1149319664
        System.out.println(protoTyleClone.getHobby().hashCode());//2093631819
        
        protoTyleClone.getHobby().setName("football");
        
        System.out.println(protoType.getHobby().getName()); //basketball
        

    }

}
public class ProtoType implements Serializable {

    private String username;

    private Hobby hobby;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Hobby getHobby() {
        return hobby;
    }

    public void setHobby(Hobby hobby) {
        this.hobby = hobby;
    }
    

}

class Hobby implements Serializable{

    private int id;
    private String name;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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



}

 

转载于:https://www.cnblogs.com/pickKnow/p/11104193.html

相关文章:

  • JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
  • SpringBoot:spring boot使用Druid和监控配置
  • linux uniq去重,awk输出(可用于爆破字典优化)
  • Linux内核简介、子系统及分类
  • [转载]浅谈JavaScript函数重载
  • 2019-7-2 作业1 2 3
  • python 基本数据类型及其功能-3-列表
  • Java虚拟机类加载机制
  • Python高效编程技巧
  • MFC:常用的消息
  • ubuntu左边栏消失
  • java表达式和三目运算符
  • Matrix: Matrix的,postScale(), postTranslate()方法
  • LeetCode--数组
  • 无向图最小环
  • [deviceone开发]-do_Webview的基本示例
  • 【css3】浏览器内核及其兼容性
  • conda常用的命令
  • css系列之关于字体的事
  • ES6语法详解(一)
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript-Array类型
  • Java知识点总结(JavaIO-打印流)
  • JS字符串转数字方法总结
  • Object.assign方法不能实现深复制
  • Redis字符串类型内部编码剖析
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Swoft 源码剖析 - 代码自动更新机制
  • Vue.js-Day01
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 笨办法学C 练习34:动态数组
  • 分享一份非常强势的Android面试题
  • 服务器之间,相同帐号,实现免密钥登录
  • 给第三方使用接口的 URL 签名实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 官方解决所有 npm 全局安装权限问题
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 马上搞懂 GeoJSON
  • 新手搭建网站的主要流程
  • 学习JavaScript数据结构与算法 — 树
  • 与 ConTeXt MkIV 官方文档的接驳
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​iOS安全加固方法及实现
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • !!java web学习笔记(一到五)
  • #Java第九次作业--输入输出流和文件操作
  • #NOIP 2014# day.1 T2 联合权值
  • $NOIp2018$劝退记
  • (1)(1.11) SiK Radio v2(一)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (学习日记)2024.01.09