zoukankan      html  css  js  c++  java
  • Java深拷贝和浅拷贝

    浅拷贝和深拷贝

    在具体解释Java深拷贝和浅拷贝之前,我们先看个例子,代码如下:

    public class Thing implements Cloneable {
        // 定义一个私有变量
        private ArrayList<String> arraylist = new ArrayList<String>();
    
        @Override
        public Thing clone() {
            Thing thing = null;
            try {
                thing = (Thing)super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            return thing;
        }
    
        public void setValue(String value) {
            this.arraylist.add(value);
        }
    
        public ArrayList<String> getValue() {
            return this.arraylist;
        }
    }
    

    下面看一下浅拷贝测试:

     1 public class Client {
     2     public static void Main(String[] args) {
     3         Thing thing = new Thing();
     4         thing.setValue("张三");
     5 
     6         // 拷贝一个对象
     7         Thing cloneThing = thing.clone();
     8         cloneThing.setValue("李四");
     9 
    10         // 打印结果是[张三,李四]
    11         System.out.println(thing.getValue());
    12     }
    13 }

    这里java做了一个偷懒的拷贝动作,Object类提供的clone()方法只是提供了拷贝本地对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生的内部元素地址,这种拷贝称为浅拷贝。

    那么下面看一下如何深拷贝??

     1 public class Thing implements Cloneable {
     2     // 定义一个私有变量
     3     private ArrayList<String> arraylist = new ArrayList<String>();
     4 
     5     @Override
     6     public Thing clone() {
     7         Thing thing = null;
     8         try {
     9             thing = (Thing)super.clone();
    10             
    11             // 深度拷贝加上这句
    12             thing.arraylist = (ArrayList)this.arraylist.clone();
    13         } catch (CloneNotSupportedException e) {
    14             e.printStackTrace();
    15         }
    16 
    17         return thing;
    18     }
    19 
    20     public void setValue(String value) {
    21         this.arraylist.add(value);
    22     }
    23 
    24     public ArrayList<String> getValue() {
    25         return this.arraylist;
    26     }
    27 }

    另外最后注意一下对象的clone()方法和对象内的final关键词是冲突的

  • 相关阅读:
    【项目】 技术选型 平台和语言
    WCF 常见逻辑和代码 1.错误处理和配置
    一个挺有意思的Javascript小问题
    【设计原则和建议】 方法返回值
    一次HTTP请求中的缓存
    【设计原则和建议】 方法
    【设计原则和建议】 字段
    Express全系列教程之(一):Express的安装 和第一个程序
    js switch语句祥解[范围判断]
    修改notepad++ zencodeing 插件的配置路径
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10236177.html
Copyright © 2011-2022 走看看