【问题标题】:Which way of converting int[] to Integer[] is fastest?将 int[] 转换为 Integer[] 的哪种方式最快?
【发布时间】:2022-09-28 00:45:50
【问题描述】:

我正在尝试将长度为 1,000,000 的很长的int[] 转换为Integer[],以便我可以使用自定义比较器对其进行排序(根据定义的Map<Integer, List<Integer>> 中相应列表的长度对元素进行排序)。

我做了以下事情:

private static Integer[] convert(int[] arr) {
        Integer[] ans = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ans[i] = arr[i];
        }
        return ans;
    }

它对我很有效,但我也遇到过

Integer[] ans = Arrays.stream(intArray).boxed().toArray( Integer[]::new );

和

Integer[] ans = IntStream.of(intArray).boxed().toArray( Integer[]::new );

有没有比其他的要快得多?或者有没有其他足够快的方法来缩短运行时间?

  • 您确定您拥有的解决方案尚未产生足够的性能吗?
  • 过早的优化。除非您的数组包含数百万个元素,否则您不会看到任何差异,即使这样,由于 JIT 优化,找出哪个稍微快一点也是一个重大项目。除非您能证明存在瓶颈,否则请不要担心。
  • 好吧,你为什么需要Integer[]?您可以为int 类型编写一个比较器。
  • Integer[]真的有必要吗?您的比较器看起来如何?无论如何,在应用算术运算符时,它可能会将所有Integers 拆箱到ints
  • 请注意,time-complexity 标签并不适用于所有关于运行代码需要多长时间的问题。这是针对与以下相关的问题算法所花费的时间与问题大小的关系.无论“某事”是什么,对数组的每个元素做某事都将是 O(n)。

标签: java arrays performance


【解决方案1】:

有没有比其他的要快得多?

您意识到您要问的问题类似于:

“我有 500,000 颗螺丝要拧到位。不幸的是,我懒得出去买螺丝刀。我确实有一把爪锤和一只旧鞋。我应该用爪锤将这些东西敲到位,还是鞋子是更好的选择吗?”

答案很明确:呃,两者都不是。请去拿一把螺丝刀。

换句话说,如果首先转换为Integer[] 的“成本”是某个任意单位的 1000 点成本,那么您列出的选项之间的差异可能在 0.01 到 0.05 点之间 - 即相形见绌,这无关紧要.因此,直接回答您的问题?没关系。

您有 2 个选项:

  1. 性能完全无关紧要。在这种情况下,这很好,实际上回答这个问题绝对没有意义。

  2. 你非常关心性能。在这种情况下,这个Integer[] 计划需要被排除在外。

    假设您可能对选项 2 感兴趣,那么您有多种选择。

    最简单的方法是享受广泛的 Java 生态系统。以前有人来过这里并做了出色的课程只是以此目的。它抽象了 int 数组的概念,并为您提供了各种有用的方法,包括排序,并且制作它的团队非常关注性能,因此他们投入了很多很多很多的人周来进行适当的性能分析(在热点、流水线 CPU 和当今复杂的操作系统之间,它是很多比你想象的要难!)。

    因此,我向您介绍:IntArrayList。它有一个.sortThis() 方法和一个.sortThis(IntComparator c) 方法,可用于排序。

    还有其他一些,在网上搜索“java原始集合”应该可以找到它们,如果由于某种原因优秀的 eclipse 集合项目不符合您的喜好(注意:您不需要 eclipse-the-IDE使用它。它是一个通用库,恰好由 Eclipse 团队维护)。

    如果您必须手动处理它,在网上搜索如何在 java 中实现快速排序并不难,因此,您可以轻松编写自己的“为我排序这个 int 数组”代码。并不是说我会重新发明那个特定的轮子。只是指出,如果必须的话,这并不太难。

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2013-02-17
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多