瞎扯
这个概念呢,在开发中非常重要,
说到底呢,其实就是内存地址的问题.
浅拷贝
什么是浅拷贝.
比如说:
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迭代.开发维护.咨询业务,付费快速解决问题.
网友评论