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关键词是冲突的

  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10236177.html
Copyright © 2011-2022 走看看