我何时以及为什么要使用System.arraycopy(或:arrays vs collections)

时间:2009-12-17 11:00:31

标签: java

在最近的答案中,我发现了一些不同的习惯(或口味)。所以我想知道什么时候以及为什么使用Java System.arraycopy(...)更像是Collection.addAll(...)?什么时候不是?

编辑它归结为数组与集合。谢谢到目前为止。但是计算机可以更有效地处理它,或者......对程序员来说更好......

感谢
迈克
[; - )

6 个答案:

答案 0 :(得分:4)

嗯,一方面System.arraycopy(...)适用于数组,Collection.addAll()适用于集合 - 所以你可以使用的内容取决于你必须使用哪种对象。

使用数组的System.arraycopy(...)的替代方法是编写循环并手动复制元素。这是

  • 更多代码
  • 因此,更有可能包含错误
  • 在大多数情况下较慢,因为System.arraycopy(...)是一种本机方法,可以使用操作系统提供的快速内存复制例程。

答案 1 :(得分:2)

数组不是Collection。因此,每当您需要将数据从数组复制到另一个数组时,请使用System.arraycopy。如果您需要将Collection中的内容添加到另一个Collection,请使用Collection.add()Collection.addAll()

答案 2 :(得分:2)

你的比较没有多大意义......数组不是集合。 System.arraycopy是一种非常快速的native复制数组的方法。这就是人们和Java框架本身使用它的原因。

答案 3 :(得分:1)

恕我直言,在大多数情况下,我会建议使用收藏品。特别是在界面和公共方法中。

例如,如果您可以选择:

public List<Integer> getFoo();
public int[] getFoo();

第一种方法让您有机会更改实施ArrayList vs LinkedList等。或者通过Collections.unmodifiableList()返回不可变版本。

如果在接口方法中返回一个数组,则在返回之前可能会强制进行防御性复制,因为您无法阻止客户端更改数组内容。此外,与数组相比,列表只有很少的缺点,例如,您几乎总是可以用ArrayList替换数组。

数组仍然有意义的地方是varargs方法或算法代码,其中cloneSystem.arraycopy等操作的速度优势是相关的。

答案 4 :(得分:0)

我想对评分最高的答案发表评论,但我猜测StackOverflow有其原因。添加:

使用System.arraycopy()允许操作系统执行Copy-On-Write数组。如果你永远不改变第二个数组中的数据,它的记忆永远不会被分配。

我知道他们说要避免“回答答案”,但重要的是知道CoW会发生。 CoW允许几乎立即生成副本并节省内存。这是因为在其中一个副本发生更改之前,永远不会分配第二个数组。

答案 5 :(得分:0)

数组不是集合。这就是为什么我们使用System.arraycopy它的本机方法来复制数组,但它非常快

相关问题