「java如何深拷贝对象」javastream深拷贝

博主:adminadmin 2023-03-19 05:46:09 501

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

本文目录一览:

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

谁能给出一个java中深拷贝 的例子 啊,我不知道是啥东西,最好能解释下深拷贝含义.

举个最简单的例子:

class A {

public int i;

public int j;

}

A a = new A();

浅拷贝:

A a1 = a;

深拷贝:

A a1 = new A();

a1.i = a.i;

a1.j = a.j;

感觉如下:

浅拷贝只拷贝对象本身

深拷贝则拷贝对象中引用的对象,一直拷贝下去。

Spring Boot 深拷贝对象

Java Class类的 clone() 方法默认为浅拷贝模式,只能实现Java基础类型的按值拷贝操作,对对象拷贝时默认为按址拷贝。这里采用对一个对象进行序列化和反序列化的方式来实现对象的深拷贝操作。

实现list的深拷贝

这时,获取source.get(0)的name值,也变成了“CDE”。

为了解决这个问题,使得改变copy中的值,不影响source中的数据,则要进行深拷贝。

即,对A类实现clone()方法:

然后,

就可以进行深拷贝了。

在此,再多描述一下关于Clone的内容。

Java对对象和基本数据类型的处理是不一样的。在Java中用对象作为入口参数的传递则缺省为“引用传递”,也就是说仅仅传递了对象的一个“引用”,这个引用的概念与C语言中的指针引用是一样的。当函数体内部对这个变量进行改变时,实质上就是对这个对象进行直接操作。

除此之外,在任何用“=”向对象变量赋值的时候都是“引用传递”。

一、当Class A的成员变量类型是基本数据类型(外加String类型)时,只要实现如上简单的clone(称影子clone)就可以。但是如果Class A的成员变量是数组或者更复杂类型时,就必须实现深度clone。

此处的A的成员变量String[],影子clone对name数组clone他们的地址,需进行深拷贝。

二、需要注意的是,Class A存在更为复杂的成员变量时,如Vector等存储对象地址的容器时,就必须clone彻底。

Java 如何复制对象

可以使用clone来实现,clone用于为引用类型的复制

1.使用clone方法的类必须先实现Cloneable接口,不然clone方法会直接返回CloneNotSupportedException不支持克隆的异常

2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。

3、在Java.lang.Object类中克隆方法是这么定义的:

protected Object clone()

throws CloneNotSupportedException

创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。

如何实现数组深拷贝和浅拷贝?

如何实现数组深拷贝和浅拷贝?

1.背景介绍

javascript分原始类型与引用类型。Array是引用类型,直接用“=”号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。这种方式的实现属于浅拷贝。

深拷贝是开辟新的储存空间,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

2.知识剖析

一维数组的深拷贝方法:slice()和concat()

slice()的使用方法

slice()语法:arrayObj.slice(start,

关于java如何深拷贝对象和javastream深拷贝的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

)

slice方法是通过参数start和end的传入值来返回数组中的一段,该方法不对原数组进行操作,而是返回一个子数组

start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。

end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

返回值:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素(如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素)。

concat()的使用方法

concat()语法:arrayObject.concat(arrayX,arrayX,......,arrayX)

arrayX:必需,可以是具体的值,也可以是数组对象。可以是任意多个。

concat() 方法用于连接两个或多个数组。 该方法不会改变现有的数组,而仅仅会返回一个新的数组。如果要进行 concat() 操作的参 数是数组,那么添加的是数组中的元素,而不是数组。

3.常见问题

1、jquery中数组深拷贝办法

语法:jQuery.extend( [deep ], target, object1 [, objectN ] )

将两个或更多对象的内容合并到第一个对象。

deep:可选。 Boolean类型 指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个同名属性也都是对象,则该"属性对象"的属性也将进行合并。

2、什么是深拷贝?

深拷贝:指的是拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样进行深拷贝后的拷贝对象就和源对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人叫张三,然后使用克隆技术以张三来克隆另外一个人叫李四,这样张三和李四就是相互独立的,不管张三缺胳膊还是李四少腿了都不会影响另外一个人。在.NET领域,值对象就是典型的例子,如int, Double以及结构体和枚举等。

3、什么是浅拷贝呢?

浅拷贝:指的是拷贝一个对象时,仅仅拷贝对象的引用进行拷贝,但是拷贝对象和源对象还是引用同一份实体。此时,其中一个对象的改变都会影响到另一个对象。例如,一个人一开始叫张三,后来改名字为张老三了,可是他们还是同一个人,不管张三缺胳膊还是张老三少腿,都反应在同一个人身上。在.NET中引用类型就是一个例子。

4 解决方案

jquery.extend()

语法:jQuery.extend( [deep ], target, object1 [, objectN ] )

将两个或更多对象的内容合并到第一个对象。

deep:可选。 Boolean类型 指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个同名属性也都是对象,则该"属性对象"的属性也将进行合并。

5.编码实战

6.扩展思考

slice和concat对数组深拷贝的局限性

slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝。对于数组内部存在对象和数组,当改变对象属性和内部数组的元素后,深拷贝的数组同样也发生了改变。

关于java如何深拷贝对象和javastream深拷贝的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。