【问题标题】:What is the time complexity of Collection.toArray()?Collection.toArray() 的时间复杂度是多少?
【发布时间】:2014-12-06 03:24:10
【问题描述】:

方法Collection.toArray()的时间复杂度是多少?是 O(n),如果是的话,它比循环和单独将列表中的值分配给数组有什么好处(当然还有漂亮的外观和一些额外的努力)。

【问题讨论】:

  • Collections 没有 toArray 方法。你是说Collection这个接口吗?
  • 谢谢你刚刚编辑它:)

标签: java arrays performance collections time-complexity


【解决方案1】:

因为toArray() 方法是抽象的,一般说它的时间复杂度是没有意义的。

然而,对于原生实现,复杂度确实是O(n)。值得注意的是CollectionIterable的子接口。实现一个无法有效迭代的Iterable 是非常荒谬的。

toArray() 的实现保持开放的事实为优化留出了空间。可能有比使用简单迭代(数组复制,在多个线程中运行......)构建数组更快的方法。但是,AbstractCollection 中的 default implementaion 使用您在问题中提到的确切方法。

【讨论】:

  • 通用的可迭代案例通常应该是n x O(Iterator#next()),但是虽然我不知道有一个,但想出一个不是 O(1) 的特殊集合应该不难next().
  • @zapl 这绝对是真的,但不适用于本机实现,我相信 OP 考虑到了这种情况。
【解决方案2】:

对任何集合调用toArray() 会遍历整个集合。对于来自java.util 的所有集合,这意味着 O(n) 时间。当然也可以构造比 O(n) 慢的实现,但是 O(n) 提供了时间的下限,因为您必须遍历整个集合。

当您需要调用专门请求数组的 API 时,或者在出于任何原因想要复制您的集合的情况下,您可以调用 toArray()。一般来说,您不想过度使用toArray(),因为它分配的额外内存足以容纳您集合中的所有元素。

【讨论】: