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

2019-01-21  本文已影响0人  Jlanglang

瞎扯

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

浅拷贝

什么是浅拷贝.

比如说:

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迭代.开发维护.咨询业务,付费快速解决问题.

上一篇下一篇

猜你喜欢

热点阅读