2009-12-17 46 views
2

在最近的答案中,我发现了一些不同的习惯(或风味)。所以我想知道何时以及为什么使用Java的System.arraycopy(...)更喜欢Collection.addAll(...)之类的东西?什么时候不?何时以及为什么要使用System.arraycopy(或:数组与vs集合)

编辑:它归结为数组与集合。非常感谢。但是哪个可以通过计算机更有效地处理,或者...对于程序员来说更好?

感谢
迈克
[;-)

+0

@DerMike:对不起,我们在同一时间编辑问题。我现在已经结合了我们的编辑。 – mikej 2009-12-17 11:19:55

+0

是的,非常感谢。 – DerMike 2009-12-17 11:23:15

回答

4

嗯,首先,System.arraycopy(...)适用于数组,Collection.addAll()适用于集合 - 所以您可以使用什么取决于您需要使用哪种对象。

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

  • 更多代码
  • 因此,更可能包含一个错误
  • 在大多数情况下慢,因为System.arraycopy(...)是可以使用操作系统提供快速的内存拷贝程序一个本地方法。
2

数组不是Collection秒。所以,无论何时您需要将数组中的数据复制到另一个数组,请使用System.arraycopy。如果您需要将一个Collection添加到另一个Collection,请使用Collection.add()Collection.addAll()

2

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

1

恕我直言,我会建议在大多数情况下使用集合。特别是在接口和公共方法。

例如,如果你可以选择之间:

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

第一种方法让你改变实现ArrayList VS LinkedList等或通过Collections.unmodifiableList()返回一个不可变版本的机会。

如果您在接口方法返回一个数组,你可能会被迫返回它,因为你不能阻止客户端改变数组内容之前进行一个防守副本。此外,与阵列相比,列表只有几个缺点,例如,几乎总是可以用ArrayList替换阵列。

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

0

我想上最精彩的答案发表评论,但StackOverflow上有他们的理由,我猜。补充:

使用System.arraycopy()允许OS做了写入时复制阵列。如果你永远不会改变第二个数组中的数据,它的存储空间永远不会被分配。

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

0

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

相关问题