【问题标题】:Efficient way to copy arrays and arraylists?复制数组和数组列表的有效方法?
【发布时间】:2010-11-20 23:04:05
【问题描述】:

我注意到在 Java 中,当您将数组传递给函数时,它会修改原始数组。我正在尝试实现使用递归的回溯方法,并且我希望对它的每次调用都有自己的数组来复制传入的数组的内容。

例如,假设我有一个原始数组,我通过一个循环调用该函数。我希望每个调用都有一个包含原始数组中所有内容的数组,但它修改的任何内容都保留在自身内部,而不是修改原始数组。这可能吗?

如果有解决方案,数组列表也可以吗?

【问题讨论】:

  • 我不清楚您是在询问只是复制数组以便其内容引用相同的对象 - 还是实际复制数组内部的对象。如果您指的是前者,那么钱德拉的答案是正确的。但是,如果您确实希望数组中的对象本身不被修改,我强烈建议您避免克隆。相反,您应该考虑使您的对象不可变,因此修改会创建一个新实例。

标签: java arrays arraylist


【解决方案1】:

您可以使用Arrays.copyOf 方法。

【讨论】:

  • 你可以克隆一个数组列表
  • 我假设这是一种昂贵的方法。如果我想要一个递归方法,但每个调用都有自己的数组,是否有另一种方法比每次都创建一个新数组更便宜?
  • @sudo: 所以你想复制数组...而不复制它?
  • @SimonJ 他想要一个持久的集合。即数组的副本中相同的东西只存储一次,然后在每个副本中存储差异。
【解决方案2】:

在 Java 中执行此操作的最快方法可能是 System.arraycopy 方法 documented here。这是一种本机方法,通常与您将获得的一样快。

在某些情况下,您可以尝试写时复制的方法,如果您没有真正修改整个数组,这可能会有所帮助。

【讨论】:

  • 值得注意的是,Arrays.copyOf 在后台使用 System.arraycopy,并负责创建目标数组,因此除非您有预先存在的目标,否则使用数组会更省力。 copyOf - 虽然这仅在 1.6 后可用
猜你喜欢
  • 2012-10-14
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2020-12-20
相关资源
最近更新 更多