程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java Deep copy, shallow copy, clone大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java Deep copy, shallow copy, clone?

开发过程中遇到Java Deep copy, shallow copy, clone的问题如何解决?下面主要结合日常开发的经验,给出你关于Java Deep copy, shallow copy, clone的解决方法建议,希望对你解决Java Deep copy, shallow copy, clone有所启发或帮助;

在Java上下文中,我们首先需要在“复制值”和“复制对象”之间进行区分。

int a = 1;
int b = a;     // copying a value
int[] s = new int[]{42};
int[] t = s;   // copying a value (the object reference for the array abovE)

StringBuffer sb = new StringBuffer("Hi mom");
               // copying an object.
StringBuffer sb2 = new StringBuffer(sb);

简而言之,对类型为引用类型的变量的引用分配是“复制值”,其中该值是对象引用。要复制对象,需要new显式地或在幕后使用某种东西。

现在用于对象的“浅”复制与“深”复制。浅复制通常表示仅复制对象的一个​​级别,而深复制通常表示复制多个级别的对象。问题在于确定水平是什么意思。虑一下:

public class Example {
    public int foo;
    public int[] bar;
    public Example() { };
    public Example(int foo, int[] bar) { this.foo = foo; this.bar = bar; };
}

Example eg1 = new Example(1, new int[]{1, 2});
Example eg2 = ... 

正常的解释是的“浅”副本eg1将是一个新Example对象,其foo等于1,并且其bar字段引用与原始对象相同的数组。例如

Example eg2 = new Example(eg1.foo, eg1.bar);

的“深层”副本的常规解释eg1是一个新Example对象,该对象foo等于1,并且其bar字段引用原始数组的副本;例如

Example eg2 = new Example(eg1.foo, Arrays.copy(eg1.bar));

(来自C / C ++背景的人们可能会说参分配会产生浅表副本。但是,这通常不是Java上下文中浅表副本的意思。)

存在另外两个问题/不确定性领域:

有多深?它会停在两个级别吗?三个级别?这是否意味着整个连接对象图?

封装的数据类型呢?例如一个字符串?字符串实际上不仅仅是一个对象。实际上,它是带有一些标量字段的“对象”,并且是对字符数组的引用。但是,API完全隐藏了字符数组。因此,当我们谈论复制字符串时,将其称为“浅”副本还是“深”副本有意义吗?还是我们应该称它为副本?

最后,克隆。克隆是所有类(和数组)上都存在的一种方法,通常认为该方法可生成目标对象的副本。然而:

此方法的规范没有明确说明这是浅拷贝还是深拷贝(假设这是有意义的区别)。

实际上,规范甚至没有明确声明克隆会产生一个新对象

这是javadoc所说的:

“创并返回此对象的副本。“ copy”的确切含义可能取决于对象的类。通常的意图是,对于任何对象x,表达式x.clone() != x将为true,而表达式x.clone().getClass() == x.getClass()将为true ,但这不是绝对要求。然通常情况x.clone().equals(X)是正确的,但这不是绝对要求。”

请注意,这就是说克隆可能是目标对象,而另一极端是克隆可能与原始对象不相等。并假设甚至支持克隆。

简而言之,对于每个java类,克隆都可能意味着不同的东西。

有人认为(如@supercat在注释中所做的那样)Java clone()方法已损坏。但是我认为正确的结论是,克隆的概念在面向对象环境中被打破了。在AFAIK中,不可能开发出一个统一的克隆模型,该模型在所有对象类型上都是一致且可用的。

解决方法

I need clarification on the differences between deep copy,shallow copy,and clone in Java

大佬总结

以上是大佬教程为你收集整理的Java Deep copy, shallow copy, clone全部内容,希望文章能够帮你解决Java Deep copy, shallow copy, clone所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。