【问题标题】:Which is faster? Using a custom Comparator class or lambda function哪个更快?使用自定义 Comparator 类或 lambda 函数
【发布时间】:2019-03-20 18:53:05
【问题描述】:

我正在尝试在 java 中创建一个排序映射(按键的降序排序)。 我试过了

Map<Integer,Integer> map = new TreeMap<>((a,b)->(b-a));

如果我为同一任务编写 Comparator 类,会不会对性能产生任何影响?

【问题讨论】:

  • 首先(a,b)-&gt;(b-a)这是错误的;其次,它在引擎盖下(几乎)是一样的,你将永远感受到差异
  • b-a 没有错,因为我希望它按降序排序。我的错 。我应该提到这一点。
  • (a,b)-&gt;(b-a) 已损坏,因为ab 之间的差异 不适合ab 的值类型。对于Integer,两个值之间的最大差值是Integer.MIN_VALUEInteger.MAX_VALUE 之间的差值,即2³²-1,或者是Integer.MAX_VALUE 的两倍。所以你的比较器容易溢出。正确的实现是(a,b)-&gt;Integer.compare(b,a)(a,b)-&gt;b.compareTo(a),其作用与Comparator.reverseOrder() 相同。底线是,不要试图通过减法实现比较器来变得聪明。
  • 我使用了b-a,因为我所有的整数都是正数,而且b-acompareTo() 方法快。这也很重要,因为我问这个问题是因为我首先想知道在竞争性编码场景中对性能的影响。我想要的是实现一个TreeMap,因为输入大小在Integer.MAX_VALUE - 1000的范围内
  • 当所有值都是正数时,这个使用差异的比较器将起作用,但我怀疑您是否曾经针对您声称 (a,b) -&gt; (b-a)(a,b) -&gt; Integer.compare(b,a)(a,b) -&gt; b.compareTo(a) 更快的说法做出有效的基准测试,resp . Comparator.reverseOrder()。但是,当然,“竞争性编码方案”通常意味着无论如何测量都是无效的,因此较高的初始化成本可能很重要。在这种情况下,在大多数情况下,使用像 Comparator.reverseOrder() 这样的现有比较器会胜出。

标签: lambda java-8 comparator treemap


【解决方案1】:

显式地创建一个类和运行时通过 lambda 表达式隐式地为你创建一个类,你永远不会感觉到区别。

您可能想要提高的是代码的可读性,这不是更容易理解吗?

new TreeMap<>(Comparator.reverseOrder());

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2016-12-18
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多