美文网首页
java中的深拷贝和浅拷贝

java中的深拷贝和浅拷贝

作者: zhouzhuo933 | 来源:发表于2017-11-20 10:38 被阅读0次

简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的.

1 深拷贝代码
public class DeepCopy implements Cloneable{

    public String text;
    public ArrayList<String> list = new ArrayList<>();

    public DeepCopy(){
        Log.d("zhouzhuo","------DeepCopy 构造函数------");
    }

    public void show(){
        Log.d("zhouzhuo","text=="+text);
        for (int i=0;i<list.size();i++){
            Log.d("zhouzhuo","list=="+list.get(i));
        }
    }

    public void add(String text){
        list.add(text);
    }

    @Override
    protected DeepCopy clone() {
        try {
            DeepCopy copy = (DeepCopy) super.clone();
            copy.text = this.text;
            copy.list = (ArrayList<String>)this.list.clone();//此处需要把list集合也拷贝一下
            return copy;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
2 浅拷贝代码

public class ShallowCopy implements Cloneable{
    public String text;

    public ArrayList<String> list = new ArrayList<>();
    public ShallowCopy(){
        Log.d("zhouzhuo","------ShallowCopy 构造函数------");
    }

    public void show(){
        Log.d("zhouzhuo","text=="+text);
        for (int i=0;i<list.size();i++){
            Log.d("zhouzhuo","list=="+list.get(i));
        }
    }

    public void add(String text){
        list.add(text);
    }

    @Override
    protected ShallowCopy clone() {
        try {
            ShallowCopy copy = (ShallowCopy) super.clone();
            copy.text = this.text;
            copy.list = this.list;//
            return copy;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3 测试代码


    public void deep(View view){
        Toast.makeText(MainActivity.this,"deep",Toast.LENGTH_SHORT).show();
        DeepCopy deepCopy = new DeepCopy();
        deepCopy.text = "deepCopy 之前";
        deepCopy.add("00000");

        DeepCopy deepCopy1 = deepCopy.clone();
        deepCopy1.text ="deepCopy 之后";
        deepCopy1.add("111");
        Log.d("zhouzhuo","============");
        deepCopy.show();
        Log.d("zhouzhuo","============");
        deepCopy1.show();
        Log.d("zhouzhuo","============");

    }


    public void shallow(View view){
        Toast.makeText(MainActivity.this,"shallow",Toast.LENGTH_SHORT).show();

        ShallowCopy shallowCopy = new ShallowCopy();
        shallowCopy.text = "shallowCopy 之前";
        shallowCopy.add("00000");
        ShallowCopy shallowCopy1 = shallowCopy.clone();
        shallowCopy1.text ="shallowCopy 之后";
        shallowCopy1.add("111");
        Log.d("zhouzhuo","============");
        shallowCopy.show();
        Log.d("zhouzhuo","============");
        shallowCopy1.show();
        Log.d("zhouzhuo","============");
    }

4 打印结果

4:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ------DeepCopy 构造函数------
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ============
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: text==deepCopy 之前
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==00000
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ============
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: text==deepCopy 之后
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==00000
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==111
11-20 10:14:48.235 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ============
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ------ShallowCopy 构造函数------
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ============
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: text==shallowCopy 之前
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==00000
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==111
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ============
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: text==shallowCopy 之后
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==00000
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: list==111
11-20 10:14:56.830 17973-17973/com.zhouzhuo.longcopy D/zhouzhuo: ============
11-20 10:15:30.510 17973-17973/com.zhouzhuo.longcopy D/dalvikvm: MakeBoost:0x4160d2c8 to 0
5 分析

通过打印的结果可以区分出深拷贝和浅拷贝的区别。不管是深拷贝和浅拷贝都不会执行构造函数。深拷贝只对引用类型起作用 。deepCopy1.text改变之后 ,deepCopy.text 也随着改变了。所以说深拷贝对于基本类型没有起作用。父本会随着副本的改变而改变。

代码下载

相关文章

  • Java基础 - 深拷贝和浅拷贝

    Java 的深拷贝和浅拷贝 什么是深拷贝、浅拷贝 (深克隆、浅克隆)? 在 Java 中,数据类型分为 基本数据类...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

  • Java的浅拷贝和深拷贝

    首先需要明白,浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。 在 Java 中,除了基...

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • 关于Java的浅拷贝和深拷贝

    浅拷贝和深拷贝是什么? 浅拷贝和深拷贝都是针对已经存在了的对象的操作,在java中,基本数据类型有八种,和引用数据...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • Java------List的深拷贝与浅拷贝

    Java的浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。 浅拷贝(Shallow Copy) ...

网友评论

      本文标题:java中的深拷贝和浅拷贝

      本文链接:https://www.haomeiwen.com/subject/stehvxtx.html