在最近的答案中,我发现了一些不同的习惯(或口味)。所以我想知道什么时候以及为什么使用Java System.arraycopy(...)
更像是Collection.addAll(...)
?什么时候不是?
编辑它归结为数组与集合。谢谢到目前为止。但是计算机可以更有效地处理它,或者......对程序员来说更好......
感谢
迈克
[; - )
答案 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方法或算法代码,其中clone
和System.arraycopy
等操作的速度优势是相关的。
答案 4 :(得分:0)
我想对评分最高的答案发表评论,但我猜测StackOverflow有其原因。添加:
使用System.arraycopy()允许操作系统执行Copy-On-Write数组。如果你永远不改变第二个数组中的数据,它的记忆永远不会被分配。
我知道他们说要避免“回答答案”,但重要的是知道CoW会发生。 CoW允许几乎立即生成副本并节省内存。这是因为在其中一个副本发生更改之前,永远不会分配第二个数组。
答案 5 :(得分:0)
数组不是集合。这就是为什么我们使用System.arraycopy它的本机方法来复制数组,但它非常快