一、什么是拷贝
拷贝指的就是将一个对象的所有属性(成员属性)拷贝到一个有着相同类型的对象中去
Java中的数据类型分为基本数据类型和引用数据类型,对于这两种数据类型,在进行赋值、用作方法参数、返回值的时候,会有值传递和地址传递的区别。
二、概要
1.浅拷贝
对于基本数据类型就是直接进行值传递,在内存的另一个空间内存放,修改这个值不会影响到拷贝源的值,对于引用数据类型就是进行的是地址传递,并没有对该对象重新开辟一个内存空间进行存放,所以对于引用数据类型的浅拷贝就相当于两个引用指向了同一个内存地址。
例子如下:
public class Demo{
public static void main(String[] args){
Student s1=new Student ("小王",22);
try{
Student s2=(Student)s1.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(s1.getName().equals(s2.getName());
s2.setName("小李");
System.out.println(s1.getName().equals(s2.getName());
}
}
class Student implements Cloneable{
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
@override
public Object clone()throws CloneNotSupportedException{
return super.clone();//浅拷贝
}
}
毫无疑问,两个都为true。
说明浅拷贝不会拷贝引用类型指向的对象,只会拷贝引用,指向的仍是同一个地址,所以这两个对象的引用对象是同一个对象,修改就会发生改变,浅拷贝也就是一个封装性的赋值操作。
2.深拷贝
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
深拷贝有两种实现方式:序列化对象方式和属性二次调用clone方法。
例子如下:
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
CloneTest source = new CloneTest(20,new CloneTest());
// 拷贝
CloneTest copy = (CloneTest)source.clone();
System.out.println("修改前:");
System.out.println(source);
System.out.println(copy);
// 修改属性
copy.setNum(23);
copy.getCloneTest().setNum(33);
System.out.println("修改后:");
System.out.println(source);
System.out.println(copy);
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class CloneTest implements Cloneable{
int num;
CloneTest cloneTest;
@Override
public Object clone() throws CloneNotSupportedException {
CloneTest clone = (CloneTest)super.clone();
if (null!=cloneTest){
// 对属性进行二次clone
clone.cloneTest =(CloneTest) cloneTest.clone();
}
return clone;
}
}
---------------输出---------------------
修改前:
CloneTest(num=20, cloneTest=CloneTest(num=0, cloneTest=null))
CloneTest(num=20, cloneTest=CloneTest(num=0, cloneTest=null))
修改后:
CloneTest(num=20, cloneTest=CloneTest(num=0, cloneTest=null))
CloneTest(num=23, cloneTest=CloneTest(num=33, cloneTest=null))
这里就证明了深拷贝就会连引用类型也拷贝一份。文章来源:https://www.toymoban.com/news/detail-474915.html
总结:
1.如果对象的属性全是基本类型的,那么可以使用浅拷贝。
2.如果对象有引用属性,那就要基于具体的需求来选择浅拷贝还是深拷贝。
3.如果对象引用任何时候都不会被改变,那么没必要使用深拷贝,只需要使用浅拷贝就行了。
如果对象引用经常改变,那么就要使用深拷,一切都取决于具体需求。文章来源地址https://www.toymoban.com/news/detail-474915.html
到了这里,关于java关于深拷贝和浅拷贝的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!