Java 创建空数组的开销?
要将列表转换为数组,需要一个空数组,如下所示:Java 创建空数组的开销?,java,performance,Java,Performance,要将列表转换为数组,需要一个空数组,如下所示: 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(EMP
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.0000000000000000000000000000000000000000000000001Ms的差异?事实上,我相信这是性能最好的版本:
fooList.toArray(new Foo[fooList.size()]);
这样,toArray始终具有精确的数组,并且不会创建额外的数组。IntelliJ建议进行这种开箱即用的重构。事实上,我认为这是性能最好的版本:
fooList.toArray(new Foo[fooList.size()]);
这样,toArray始终具有精确的数组,并且不会创建额外的数组。IntelliJ建议立即进行重构。在我的计算机上,创建100000000个对象[0]数组需要2.9秒。如果每秒创建一百万个数组,甚至100000个,这可能会产生显著的差异。在我的计算机上,创建100000000个对象[0]数组需要2.9秒。如果你每秒创建一百万个数组,甚至100000个,这可能会产生显著的差异。我认为,首先质疑为什么需要将数组转换为列表,反之亦然,会更有意义。如果可以的话,最好还是坚持使用集合类,避免使用数组,因为数组比使用集合类更容易出错 如果您“大量”使用这段代码,那么就编写一个可以重用的方法,但是为了确定您应该在优化这段代码方面投入多少精力,您需要对它进行分析,并查看与其他代码相关的开销,以及这段代码在运行时实际使用的频率
正如Knuth所说:过早优化是万恶之源:-我认为首先质疑为什么需要将数组转换为列表,反之亦然,会更有意义。如果可以的话,最好还是坚持使用集合类,避免使用数组,因为数组比使用集合类更容易出错 如果您“大量”使用这段代码,那么就编写一个可以重用的方法,但是为了确定您应该在优化这段代码方面投入多少精力,您需要对它进行分析,并查看与其他代码相关的开销,以及这段代码在运行时实际使用的频率
正如Knuth所说:过早优化是万恶之源:-这是值得的。这就是分析的目的。只有您才能确定自己代码中的瓶颈是什么。位优化是问题的根源。@Saeed,胡说八道。问题是在对实际问题进行任何观察之前进行优化。您不使用无参数toArray函数有什么具体原因吗?@KirkWoll,如果其他开发人员使用此静态字段,它可能是一个魔鬼。这是值得的。这就是分析的目的。只有您才能确定自己代码中的瓶颈是什么。位优化是问题的根源。@Saeed,胡说八道。问题是在对实际问题进行任何观察之前进行优化。您不使用无参数toArray函数有什么具体原因吗?@KirkWoll,如果其他开发人员使用此静态字段,它可能是一个魔鬼。很好的一点,+1。如果你不这样做,它会在引擎盖下分配更多的数组,或者干脆不直接使用Java的数组对象?ArrayList等,在内部使用它们。在Java集合框架中,它们是真正的弃儿。如果您传递的数组的大小小于集合的大小(包括0),它将创建多个数组,而不是元素数完全正确的数组。然而,它确实使用反射来实现这一点,所以您的方式仍然更可取。非常好的一点,+1。如果你不这样做,它会在引擎盖下分配更多的数组,或者干脆不直接使用Java的数组对象?ArrayList等,在内部使用它们。在Java集合框架中,它们是真正的弃儿。如果您传递的数组的大小小于集合的大小(包括0),它将创建多个数组,而不是元素数完全正确的数组。然而,它确实使用反射来实现这一点,所以您的方式仍然是可取的。