【问题标题】:List.toArray(Object[]) performance [duplicate]List.toArray(Object[]) 性能 [重复]
【发布时间】:2014-05-19 17:42:10
【问题描述】:

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

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

但是,最终我需要一个 BsArray 而不是 List

所以我的问题是,哪个更快。

  1. 使用CollectionUtils.collect转换列表
  2. 使用listOfBs.toArray(new B[listOfBs.size()]) 创建一个数组

或者

  1. 循环遍历listOfAs
  2. 将每个 A 对象转换为 B 对象
  3. 将每个 B 对象添加到数组 (B[])

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

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

那么哪种方法更快

【问题讨论】:

  • 为什么不一步一步转换收集成数组呢?您不必强制使用CollectionUtils。更好的是,只需使用 Java 8。
  • 我目前不能使用 Java 8,尽管我想知道 Java 8 提供的功能名称。我可以循环和转换对象,但代码越少越好。因此,如果toArray 不会对性能造成很大影响,我可能会使用它。
  • 我认为没有太大区别,当您查看代码 CollectionUtils.collect 时,它正在循环列表和转换对象,这是您替代方法的前两个步骤

标签: java performance toarray


【解决方案1】:

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

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

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

信不信由你,这更快。

【讨论】:

    【解决方案2】:

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

    由于它是使用 Arrays.copyOf 实现的,最终会出现在 System.arraycopy 中,因此它是在本机代码中实现的,它可能比 java 级循环更快。

    【讨论】:

    • 线性是什么意思?
    • 我的意思是性能(时间)与输入大小成正比,因为它基于单个循环。
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2015-11-27
    • 1970-01-01
    • 2019-09-09
    • 2019-01-03
    相关资源
    最近更新 更多