创建空数组的开销?

时间:2012-02-24 23:00:07

标签: java performance

为了将List转换为数组,您需要一个空数组,如下所示:

List<Foo> fooList;
Foo[] foos = fooList.toArray(new Foo[0]);

我碰巧经常使用这段代码片段,因此我不是每次都创建一个空数组,而是决定创建一个静态空数组,每次都使用它。 e.g。

private static Foo[] EMPTY_FOOS = new Foo[0];

List<Foo> fooList;
Foo[] foos = fooList.toArray(EMPTY_FOOS);

这是值得的还是我们正在寻找0.0000000000000000000000000000000000000000000000000000000001ms的差异?

3 个答案:

答案 0 :(得分:7)

实际上我相信这是表现最好的版本:

fooList.toArray(new Foo[fooList.size()]);

这种方式toArray()总是具有确切的数组,并且不会创建额外的数组。 IntelliJ建议开箱即用这样的重构。

答案 1 :(得分:2)

在我的计算机上,创建100,000,000个Object[0]阵列需要2.9秒。如果您每秒创建一百万个数组,甚至100,000,那么它可能会产生可测量的差异。

答案 2 :(得分:1)

我认为,首先要质疑为什么需要将数组转换为Lists,反之亦然。如果可以避免使用数组,那么最好不要使用Collection类,因为它们比使用Collection类更容易出错。

如果您经常使用那段代码,那么请编写一个可以重用的方法,但为了确定您应该在优化此代码方面投入哪些精力,您需要对其进行分析并查看其中的开销是多少。与您的其他代码的关系以及此代码在运行时实际使用的频率。

正如Knuth所说:“过早优化是所有邪恶的根源”: - )