【问题标题】:How to know when to clone in java?如何知道何时在 java 中克隆?
【发布时间】:2014-04-19 03:12:49
【问题描述】:

我在理解 Java 中的 clone 方法时遇到了问题。

在本例中,输出为 1。

int[][]x = {{1,2},{3,4}};
int[][]y = new int[2][];
y[0] = x[0].clone();
y[1] = x[1].clone();
x[0][0] = 0;
System.out.println(y[0][0]);

在本例中,输出为 100 8

 int[][][] x = {{{1,2},{3,4}},{{5,6},{7,8}}};
 int[][][] y = new int[2][2][];
 y[0] = x[0].clone();
 y[1][1] = x[1][1].clone();
 x[0][0][0] = 100;
 x[1][1][1] = 200;
 System.out.println(y[0][0][0]+" "+y[1][1][1]);

为什么第二个例子中 y 数组的值发生了变化,而第一个例子没有变化?

【问题讨论】:

  • 我得到 100 8,我希望它是 1 8。

标签: java arrays clone


【解决方案1】:

好问题。

要理解这一点,您必须了解 (1) Java 中的多维数组是什么,以及 (2) clone() 是“浅”的。

我将在这些示例中开始使用二维数组,因为它们更简单一些。

(1) Java 中的二维数组是数组的数组。

int[][] a = new int[4][];
a[0] = new int[1];
a[1] = new int[8];
a[3] = new int[0];

这是一个由四个ints 组成的数组:1 个int 的数组,8 个ints 的数组,null 和一个没有ints 的数组。

(2) 现在,clone() 做了一个 复制。这意味着它创建了具有相同元素的数组(或对象)的副本,但该复制的数组(或对象)的元素与原始元素相同。

这意味着如果我有

int[][] b = a.clone();

那么b 是与a 不同的数组,具有相同的元素。如果我做a[0] = new int[45],那么b 不受影响。

但请记住,b元素a 的元素相同。所以如果我这样做了

a[0][0] = 1

这会影响b[0],因为a[0]b[0] 在内存中是同一个数组。


现在,你的案子呢?

int[][]x = {{1,2},{3,4}};
int[][]y = new int[2][];
y[0] = x[0].clone();
y[1] = x[1].clone();

您必须在 2D 阵列上进行“2-deep”克隆。也就是说,xy 是不同的。而x[0]y[0] 是不同的。但是x[0][0]y[0][0]在内存中是一样的。但是,哦,看起来这只是一个int,你不能像数组一样改变int

在第二个示例中,您实际上是在 3D 阵列上进行 2 深度克隆。您可以(并且确实)改变x[0][0],这与y[0][0] 相同。

【讨论】:

  • 好的。所以在我的第一个例子中,为什么 x[0][0] = 0;它对 y[0] 没有任何影响?
  • 其实一般来说,你需要了解的是深拷贝和浅拷贝的区别。换句话说... 指针 .
  • @PaulDraper 谢谢。我想我理解得更好一些。对我来说最令人困惑的部分是理解为什么 y[0]=x.clone() 在第一个示例中不指向 x 数组,而在第二个示例中却指向。
猜你喜欢
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2016-04-09
  • 2022-08-09
相关资源
最近更新 更多