「深拷贝java」深拷贝java 列表

博主:adminadmin 2023-03-22 20:35:08 823

今天给各位分享深拷贝java的知识,其中也会对深拷贝java 列表进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

JAVA 中浅拷贝与深拷贝有什么区别?

浅拷贝 指的是你的类本身被拷贝,而没有拷贝类本身属性中的类

深拷贝 指的是包含类本身和属性类在内的所有类的拷贝。

简单点说:

就是浅拷贝的两个对象中的属性还会指向同一个类,而深拷贝则全部单独了。也就是说深拷贝把关联关系也拷贝了。

具体例子你可以参看我的blog,里面篇文章介绍:)

浅复制和深复制的区别 java

浅复制和深复制的区别 java

大体上来说,深拷贝与浅拷贝的区别主要还是在于指针(或与指针)方面,浅拷贝只是简单的把源对象(这个是指广义的对象,不仅仅单指类的实例)的指针赋值给目标对象,对目标指针的操作就是对源对象的操作,所以在很多情况下,目标对象析构(或跳出其可见域)之后,源对象相关部分也就一同析构了。而深拷贝,是为目标对象重新分配空间,这样可以与源对象的操作分开。

java深拷贝和浅拷贝的区别

浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制

深拷贝:对象,对象内部的引用均复制

示例:

public static Object copy(Object oldObj) {  

    Object obj = null;  

    try {  

        // Write the object out to a byte array  

        ByteArrayOutputStream bos = new ByteArrayOutputStream();  

        ObjectOutputStream out = new ObjectOutputStream(bos);  

        out.writeObject(oldObj);  

        out.flush();  

        out.close();  

  

        // Retrieve an input stream from the byte array and read  

        // a copy of the object back in.  

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());   

        ObjectInputStream in = new ObjectInputStream(bis);  

        obj = in.readObject();  

    } catch (IOException e) {  

        e.printStackTrace();  

    } catch (ClassNotFoundException cnfe) {  

        cnfe.printStackTrace();  

    }  

    return obj;  

}

java复制对象时字段新增前缀

Java 对象的一共有 3 种复制对象的方式。

1.直接赋值 (引用复制 ),此种复制方式比较常用。

诸如 A a = b ; a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象。 此时 a == b [ true ] 。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 classA{2 privateString string;3 A(){string = new String("original state");}4 public void set(String string) {this.string =string;}5 public String get() {returnstring;}6 }7

8 public classB{9 public static voidmain(String[] args) {10 //TODO 自动生成的方法存根

11 A a = newA();12 A b =a;13 System.out.println(a ==b);14 a.set("state has changed");15 System.out.println(a ==b);16 }17 }

View Code

2.浅拷贝 ------- 复制当前对象的非静态字段【静态字段只在类加载的时候加载一次】,如果当前字段为 值类型 字段,那么直接复制该字段,如果是 引用类型 的,则对其复制引用。

所谓的值类型就是指Java中的8种基本类型,那么什么是值类型的复制呢?

举个例子 int A = 0; int B = A; 那么这样B拷贝的是A指向的常量对象,而非A的引用,当A改变时,并不会影响B的指向。【Ps: A =1; 则B = 0 ,而非 1 , 这就是值类型的复制】

所谓的引用类型就是一些你自己构建的类和库中的一些类实例化出来的对象,引用复制又指的啥呢?

举个例子

class A {public int value = 0 ; } ==== A a = new A(); A b = a; ===== a.value = 1; 那么 == b.value = 1; 因为它们指向的是同一个对象【复制的是引用】

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 class B implementsCloneable{2

3 privateC c;4

5 privateString string ;6 public B() {string = new String("Init string"); c = newC();}7 public void set(String string) {this.string =string;}8 public String get() {returnstring;}9

10 //setC()方法中添加一句 c = new C() ,就变为深拷贝了,因为添加了 这句代码, 拷贝 引用类型时,就变成拷贝其对象,而不是引用了

11 public voidsetC(String string) {c.set(string);}12 public String getC() {returnc.get();}13

14

15 @Override16 publicObject clone() {17 B sCopy = null;18 try{19 sCopy = (B)super.clone();20 }catch(Exception e) {21 e.printStackTrace();22 }23 returnsCopy;24 }25 }26 public static voidmain(String[] args) {27 //TODO 自动生成的方法存根

28

29

30 B sCopyA = newB();31 B sCopyB =(B) sCopyA.clone();32

33 sCopyA.set("hava changed !");34 //sCopyA.string = hava changed ! ------- sCopyA.string = Init string35 //改变了 sCopyA 并没有改变 sCopyB。 因为 B.string 是一个值类型

36 System.out.println("sCopyA.string = "+ sCopyA.get()+" ------- sCopyA.string = "+sCopyB.get());37

38 sCopyB.setC("C have Changed !");39 //C.string = C have Changed ! ------- C.string = C have Changed !40 //改变了 sCopyA 同时也改变 sCopyB。因为 B.string 是一个引用类型

41 System.out.println("C.string = "+ sCopyA.getC()+" ------- C.string = "+sCopyB.getC());42 }

View Code

3.深拷贝 ------- 和浅拷贝的区别就在于,其不管字段类型是什么,统统的全给拷贝过去【即使相对与 非基本类型而言 拷贝的也是对象而不是引用 ,深拷贝之后将会产生2个对象 ,浅拷贝只是一个对象的2个引用而已(相当于1个人的2个名字)】。

我们只要在 2的基础上添加一行代码就行, 因为只要将 引用字段,也进行复制 ,就是深拷贝了。

附:1.clone()方法 需要覆写。 2.覆写clone()方法需要实现Cloneable 接口, 未实现的话会抛出异常。 3 .clone()是本地方法,其内部实现如下图。

2708f3cdcfe8a632a43a58352302c9b8.png

什么是深拷贝和浅拷贝

浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。

深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个对象,因此普通的赋值既不是深拷贝也不是浅拷贝。

深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。

而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

深拷贝java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于深拷贝java 列表、深拷贝java的信息别忘了在本站进行查找喔。