【问题标题】:In a construct of the following if - else if - else if structure, how many comparisons are made, 1 or 3?在以下 if - else if - else if 结构的构造中,进行了多少次比较,1 次还是 3 次?
【发布时间】:2014-09-28 22:32:29
【问题描述】:

是否每次在相同的 if - else if 构造中调用 compareTo 时都会进行新的比较,或者是否进行了单个比较?

public void genericComparisons(Comparable e, Comparable target){
    if(e.compareTo(target) == 0)
       // do this
    else if(e.compareTo(target) > 0)
       // do something else
    else if(e.compareTo(target) < 0)
       // do that
} // end method

【问题讨论】:

  • Java 有一个叫做“局部变量”的特性。只需调用一次e.compareTo(target) 并将结果存储到本地int 变量中。

标签: java performance comparison big-o counting


【解决方案1】:

您显然可以使用局部变量对其进行优化...这样的优化总是好的,因为它使您的代码更清晰,重复性更少。

但是,假设你compareTo 是一个简单的无副作用的方法,JVM 可能会内联它并且可以为你做这个优化。我想,这才是你真正想知道的。

没有简单的方法可以找到它,尤其是使用println 肯定会失败,因为 JVM 可以让您的编程速度更快,但行为不会有所不同。您在字节码中看不到它,因为它根本不包含任何优化,它们会在程序运行一段时间时发生。

JVM也不允许改进你的编码风格,所以我建议使用局部变量,特别是对于更复杂的表达式。


当达到时,您的最后一个条件显然总是正确的。如果您希望代码看起来系统且对称,请使用此

public void genericComparisons(Comparable e, Comparable target) {
    int cmp = e.compareTo(target);
    if (cmp < 0) {
       // less
    } else if (cmp > 0) {
       // greater
    } else {
       // same
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2011-05-25
    • 2018-09-08
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多