美文网首页
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中的深拷贝和浅拷贝

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