【问题标题】:What is .clone() doing with arrays?.clone() 对数组做了什么?
【发布时间】:2020-09-08 09:18:04
【问题描述】:

例如

int[] test = new int[]{1,2,3};

我想克隆它(深拷贝)

int[] another = test.clone();

Java 在这里真正做什么?是单独复制所有元素 (O(n)) 还是别的?

【问题讨论】:

  • 你认为这应该不是O(n)
  • 或者你可以查看源代码。
  • @user809495 好吧,如果你克隆一个数组,你必须至少读取每个元素一次。你不能用一些聪明的算法跳过一些元素的阅读。如果你想克隆一个元素,你必须阅读它,不管如何。这本质上是 O(n)
  • 那么做 int[] another = test.clone() 和做 int[] another = test 一样吗?

标签: java arrays clone


【解决方案1】:

当你克隆一个数组时,你需要至少读取每个元素一次。你不能用一些聪明的算法跳过一些元素的阅读。如果你想克隆一个元素,你必须阅读它。这本质上是 O(n)

Object#clone 方法

[...] 创建这个对象的类的一个新实例,并用这个对象的相应字段的内容来初始化它的所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

换句话说,此方法复制。当您有int[] 时, 被复制并分配 到新数组。当您拥有Object[] 时,仍然会复制并分配 。请记住,引用也只是一个值。

int[] 的内容是整数值。因此,您可以在不影响原始数组的情况下更改克隆数组。 Object[] 的内容是引用。克隆的 reference 仍将指向 same 对象。因此,如果您访问克隆数组中的对象,您访问原始数组中引用的相同对象。

【讨论】:

  • 所以你说的是一个克隆对象是一个新对象,但它的所有值都是对原始对象的引用。我说对了吗?
  • @user809495 我认为我的答案和文档写得很清楚。如果您不确定某事,您应该花时间了解我在那里写的内容以及文档中写的内容。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多