Java 在switch语句中使用Math.signum(x)或Integer.compare(x,0)更好吗?
假设我有一个int x,我希望代码根据x的符号做不同的事情。如果使用switch语句,使用Integer.compare(x,0)或Math.signum(x)更好(更快)吗 vs 此外,使用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
案例0:
和默认值:
之间是否存在性能差异?
提前感谢。总结所有评论:
Integer.compare
有一个问题,即API协定没有指定结果为-1、0或1。(这是当前实现返回的结果,但在未来的版本中可能会发生变化。)Math.signum
接受float
或double
参数并返回相同类型的结果。因此,您需要在switch
语句中进行类型转换(toint
)。此外,转换和其他事情很可能会降低效率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;
}