java 复制堆栈,java - 深拷贝,浅拷贝,克隆 - 堆栈内存溢出

不幸的是,“浅拷贝”,“深拷贝”和“克隆”都是相当不明确的术语。

在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上下文中浅层复制的意思......)

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

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

封装数据类型怎么样; 例如一个字符串? String实际上不只是一个对象。 实际上,它是一个带有一些标量字段的“对象”,以及对一个字符数组的引用。 但是,API完全隐藏了字符数组。 因此,当我们谈论复制字符串时,将其称为“浅”副本还是“深度”副本是否有意义? 或者我们应该把它称为副本?

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

这种方法的规范故意没有说明这是浅层还是深层(假设这是一个有意义的区别)。

实际上,规范甚至没有具体说明克隆产生了一个新对象。

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

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

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

有些人认为(正如@supercat在评论中所做的那样)Java clone()方法已被破坏。 但我认为正确的结论是克隆的概念在OO的背景下被打破了。 在AFAIK中,不可能开发出一种统一的克隆模型,该模型在所有对象类型中都是一致的和可用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值