Java 在switch语句中使用Math.signum(x)或Integer.compare(x,0)更好吗?

Java 在switch语句中使用Math.signum(x)或Integer.compare(x,0)更好吗?,java,int,switch-statement,compare,sign,Java,Int,Switch Statement,Compare,Sign,假设我有一个int x,我希望代码根据x的符号做不同的事情。如果使用switch语句,使用Integer.compare(x,0)或Math.signum(x)更好(更快)吗 vs 此外,使用案例0:和默认值:之间是否存在性能差异? 提前感谢。总结所有评论: 使用Integer.compare有一个问题,即API协定没有指定结果为-1、0或1。(这是当前实现返回的结果,但在未来的版本中可能会发生变化。) Math.signum接受float或double参数并返回相同类型的结果。因此,您需要在s

假设我有一个int x,我希望代码根据x的符号做不同的事情。如果使用switch语句,使用Integer.compare(x,0)或Math.signum(x)更好(更快)吗

vs

此外,使用
案例0:
默认值:
之间是否存在性能差异?
提前感谢。

总结所有评论:

  • 使用
    Integer.compare
    有一个问题,即API协定没有指定结果为-1、0或1。(这是当前实现返回的结果,但在未来的版本中可能会发生变化。)

  • Math.signum
    接受
    float
    double
    参数并返回相同类型的结果。因此,您需要在
    switch
    语句中进行类型转换(to
    int
    )。此外,转换和其他事情很可能会降低效率

  • Integer.signum更有效,它被指定为返回-1、0或1

  • 在这种情况下,
    if(x>0){…}else if(x<0){…}else{…}
    可能是最有效的

  • 如果你真的在意,你可以编写一个微基准测试来测试上面的陈述


    然而,要小心过早优化的陷阱;i、 e.浪费时间在性能对整体应用程序性能影响最小的现有优化方法上。

    Integer.compare的契约不能保证答案是-1、0或1。使用这个会有你自己的危险。哦,有没有任何情况下它会返回其他东西?或者它只是在Java的未来版本中可能发生更改?它可能在未来的版本中发生更改。Oracle的最新Java 8版本返回-1、0或1。我没有检查其他版本。但是作为一般原则,你永远不应该假设一个方法做了Javadoc没有说的事情。谢谢你的建议,我会记住这一点。如果你追求速度,你最好使用
    If(x>0){…}else If(x<0){…}else{…}
    噢,我甚至不知道Integer.signum存在,谢谢!答案被接受。
    switch (Integer.compare(x, 0)) {
    case 1:
        // positive
        break;
    case -1:
        // negative
        break;
    case 0:
        // zero
        break;
    }
    
    switch (Math.signum(x)) {
    case 1:
        // positive
        break;
    case -1:
        // negative
        break;
    case 0:
        // zero
        break;
    }