在最近的答案中,我发现了一些不同的习惯(或风味)。所以我想知道何时以及为什么使用Java的System.arraycopy(...)
更喜欢Collection.addAll(...)
之类的东西?什么时候不?何时以及为什么要使用System.arraycopy(或:数组与vs集合)
编辑:它归结为数组与集合。非常感谢。但是哪个可以通过计算机更有效地处理,或者...对于程序员来说更好?
感谢
迈克
[;-)
在最近的答案中,我发现了一些不同的习惯(或风味)。所以我想知道何时以及为什么使用Java的System.arraycopy(...)
更喜欢Collection.addAll(...)
之类的东西?什么时候不?何时以及为什么要使用System.arraycopy(或:数组与vs集合)
编辑:它归结为数组与集合。非常感谢。但是哪个可以通过计算机更有效地处理,或者...对于程序员来说更好?
感谢
迈克
[;-)
嗯,首先,System.arraycopy(...)
适用于数组,Collection.addAll()
适用于集合 - 所以您可以使用什么取决于您需要使用哪种对象。
带数组的System.arraycopy(...)
的替代方法是手动编写循环和复制元素。这是
System.arraycopy(...)
是可以使用操作系统提供快速的内存拷贝程序一个本地方法。数组不是Collection
秒。所以,无论何时您需要将数组中的数据复制到另一个数组,请使用System.arraycopy
。如果您需要将一个Collection
添加到另一个Collection
,请使用Collection.add()
或Collection.addAll()
。
你比较没有任何意义的许多...数组不是集合。 System.arraycopy
是一个非常快速的native
复制数组的方法。这就是人们和Java框架本身使用它的原因。
恕我直言,我会建议在大多数情况下使用集合。特别是在接口和公共方法。
例如,如果你可以选择之间:
public List<Integer> getFoo();
public int[] getFoo();
第一种方法让你改变实现ArrayList
VS LinkedList
等或通过Collections.unmodifiableList()
返回一个不可变版本的机会。
如果您在接口方法返回一个数组,你可能会被迫返回它,因为你不能阻止客户端改变数组内容之前进行一个防守副本。此外,与阵列相比,列表只有几个缺点,例如,几乎总是可以用ArrayList
替换阵列。
数组仍然有意义的地方是可变参数方法或算法代码,其中clone
和System.arraycopy
等操作的速度优势是相关的。
我想上最精彩的答案发表评论,但StackOverflow上有他们的理由,我猜。补充:
使用System.arraycopy()允许OS做了写入时复制阵列。如果你永远不会改变第二个数组中的数据,它的存储空间永远不会被分配。
我知道他们说避免“答案的答案”,但它的重要性足以知道CoW会发生。 CoW允许几乎立即生成副本并节省内存。这是因为在其中一个副本发生更改之前,第二个数组从未被分配。
数组不是集合。这就是为什么我们使用Sysytem.arrcopy它的本地方法来复制数组,但它非常快速
@DerMike:对不起,我们在同一时间编辑问题。我现在已经结合了我们的编辑。 – mikej 2009-12-17 11:19:55
是的,非常感谢。 – DerMike 2009-12-17 11:23:15