java object toarray_关于java:List.toArray(Object [])性能

本问题已经有最佳答案,请猛点这里访问。

我得到对象A的List,然后使用Apache Commons Collection4将获得的List从具有A实例转换为具有B实例。

listOfBs = (List) CollectionUtils.collect(listOfAs, componentTransformer);

但是,最终我需要B的Array而不是List。

所以我的问题是,这更快。

使用CollectionUtils.collect转换列表

使用listOfBs.toArray(new B[listOfBs.size()])创建数组

要么

遍历listOfAs

将每个A对象转换为B对象

将每个B对象添加到数组(B [])

第一种方法与第二种方法的区别在于,第一种方法的代码少得多,但是我不确定toArray方法是否存在隐藏循环或昂贵的操作。

我在第二种方法中看到的是,我确定我只会在listOfAs列表上循环一次。

那么哪种方法更快呢?

为什么不一步一步转换并收集到一个数组中呢? 您没有被迫使用CollectionUtils。 更好的是,只需使用Java 8。

我目前无法使用Java 8,尽管我想知道Java 8为此提供的功能名称。 我可以循环和转换对象,但是代码越少越好。 因此,如果toArray不会对性能造成重大影响,则可以使用它。

我不认为有很大的区别,当您查看代码CollectionUtils.collect时,它正在遍历列表和转换对象,这是您使用替代方法的前两个步骤

不必担心List.toArray()的性能,它的复杂度是线性的,因为它将在内部使用单个循环。

由于它是使用Arrays.copyOf来实现的,而Arrays.copyOf最终是用本机代码实现的,因此是System.arraycopy所实现的,它可能甚至比Java级循环还快。

线性是什么意思?

我的意思是性能(时间)与输入大小成正比,因为它基于单个循环。

阅读这篇文章非常有趣:http://shipilev.net/blog/2016/arrays-wisdom-ancients/#_conclusion

它详细介绍了将List转换为数组的不同方法。

结论:不要使用您所说的listOfBs.toArray(new B[listOfBs.size()]),而是使用listOfBs.toArray(new B[0])。

信不信由你,这会更快。

你可能感兴趣的:(java,object,toarray)