【问题标题】:Efficient array expansion in JavaJava中的高效数组扩展
【发布时间】:2014-04-29 16:32:51
【问题描述】:

在 C/C++ 中,我们有realloc,它将有效地为现有集合分配额外的空间。 I guess it is sub linear (or even constant) in complexity.

有没有办法在 Java 中实现相同的功能?这是我看过的项目,

  1. 无法调整数组大小,
  2. 将一个数组复制到另一个更大的数组是线性复杂的。看了System.arrayCopyArrays.copyOf
  3. ArrayList 必须与上述第 2 点相同。

注意:我的要求是将一个非常大的数组扩展得更远。

【问题讨论】:

  • 我认为没有,但是您可以通过使用摊销时间等因素和使用系统方法来更接近它。在这种情况下 System.arrayCopy 要快得多。
  • 坦率地说,在 Java 中甚至不用担心它。
  • 真的必须是一个大数组吗?除非您将它与其他东西(jni)连接,否则我可能会使用不同的结构——数组的链表或其他东西?你仍然可以将它包装在一个类中,让它与它交互,但是你喜欢 - 这一切都假设你正在谈论一个比你的 PC 内存多 1/3 的数组,如果它不是那么大的话我会就按照Louis说的去做,别管它,让java为你处理,Java一般会做很聪明的事情。
  • @BillK, & louis,我明白了。感谢您的投入。

标签: java arrays


【解决方案1】:

realloc 在实践中可能是 O(n),因为它有时/经常涉及内存复制。从这个意义上说,它在理论上的复杂性等同于在 Java 中分配一个新数组。

现在 Java 总是将新分配的内存归零,这可能需要更长的时间,但 OTOH 的内存分配速度非常快,因此在某些情况下它甚至可能比 realloc 更快。我希望涉及在 Java 中分配新数组的策略总体上与realloc 的速度大致相当。可能 Java 更适合较小的数组,C/C++ 更适合大数组,但 YMMV。您必须在特定的实施和工作负载中进行基准测试才能确定。

总的来说:

  • 不用担心,只需在 Java 中重新分配新数组即可
  • 如果您经常这样做,请确保重新创建具有比您需要的更多空间的数组,这样您就不需要在添加每个元素时重新分配(这就是 Java ArrayList 在内部所做的事情。

最后但重要的一点:除非您正在编写非常低级的代码,否则您可能不应该担心这一点。只需使用已经存在的优秀集合类之一(Java Collections、Google Collections、Trove 等),让它们为您处理所有这些东西。

【讨论】:

  • 根据您的所有输入,我明白了。将尝试使用Arrays.copyTo,看看它是如何进行的。谢谢。
  • +1 表示trovegoogle collection
猜你喜欢
  • 2011-12-09
  • 2014-06-11
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多