美文网首页
日更(二十一)-Android-深拷贝与浅拷贝

日更(二十一)-Android-深拷贝与浅拷贝

作者: Jlanglang | 来源:发表于2019-01-21 22:30 被阅读0次

    瞎扯

    这个概念呢,在开发中非常重要,
    说到底呢,其实就是内存地址的问题.

    浅拷贝

    什么是浅拷贝.

    比如说:

    1.传递形参:

      public void test() {
            A a = new A();
            copy(a);
        }
    
        public void copy(A a) {
            a.str = "132";
        }
    
        class A {
            public String str = "1";
        }
    

    这里是传递对象A的地址值.也就是说在copy方法里面.是可以通过形参改变对象a
    的值的.

    集合添加

      public void test() {
            ArrayList<A> objects = new ArrayList<>();
            objects.add(new A());
    
            ArrayList<A> arrayList = new ArrayList<>();
            arrayList.addAll(objects);
        }
    

    集合添加肯定是浅拷贝.
    为什么?
    因为集合本身是一个对象.而集合内保存的也只是对象的地址引用而已.
    一个对象,不管被多少个数组,集合添加了,它都还是只有一个.

    这点一定要搞清楚.
    如果搞不清楚,总会有一天,一个bug会告诉你,花儿为什么这样红.哈哈

    深拷贝

    深拷贝,无非两种
    1.原型模式.
    2.序列化.

    其实本质上是一样的.

    原型模式

    所谓原型模式是啥,就是可以通过一个方法,复制一份当前模式的对象.
    在java,android中,也就是实现Cloneable接口就o了

    public class Test6 implements Cloneable{
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    

    俗称克隆模式.其原理

    
        /*
         * Native helper method for cloning.
         */
        @FastNative
        private native Object internalClone();
    

    应该也是序列化.


    序列化

    不管是java还是前端js.还是什么.
    序列化的本质,其实就是把对象变成json一样的东西,然后再解析创建对象赋值

     public void test() {
    
            A a = new A();
            String a = JSON.parse(a);//"{\"a\":1,\"b:0\"}";
    
            A a = JSON.form(a,A.Class);
    
        }
    
        class A {
            int a = 1;
            int b = 0;
        }
    
    

    大致就是这么个意思.

    深拷贝的意思,其实就是重新创建一个对象,然后赋值

        public void test() {
    
            A a = new A();
            A a1 = new A();
            a1.var1 = a.var1;
            a1.var2= a.var2;
        }
    
        class A {
            int var1 = 1;
            int var2 = 0;
        }
    

    这才是深拷贝.

    Android中的序列化 Serializable,Parcelable

    其实如同Json.fromJson差不多.把对象的属性,按规则,解析成String .保存到磁盘上,
    然后在从磁盘上读取,生成对象.原理大致就这么回事.
    所以,有时候用json传递对象也是一种选择.其实不比序列化差.还方便.但是有大小限制.太大的json还是别通过bundle传.

    总结

    浅拷贝不会创建新的对象,拷贝的是内存地址.
    深拷贝必定在内存中创建新的对象.真拷贝


    交流群:493180098,这是个很少吹水,交流学习的群.
    APP开发维护咨询群 : 492685472 ,承接APP迭代.开发维护.咨询业务,付费快速解决问题.

    相关文章

      网友评论

          本文标题:日更(二十一)-Android-深拷贝与浅拷贝

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