我的代码中有以下几行:
if (command.equals("sort") && args.length == 2) {
//run some program
}
有人建议我应该使用两个单独的if
语句,因为如果命令不等于“sort”,则无需评估任何其他if
语句,无论是否args长度是正确的。
因此,我需要将我的代码重写为:
if (command.equals("sort")) {
if (args.length == 2) {
//run some program
}
}
我知道他们都做了这个工作,但我的问题是哪一个更好,效率更高?
答案 0 :(得分:14)
不,那不是真的。他们称之为short circuit
,如果第一个条件评估为假,则第二个条件根本不会被评估。
答案 1 :(得分:7)
好吧,因为&&
是short-circuit
运算符。所以if
语句实际上都是一样的。
因此,在第一种情况下,如果您的command.equals("sort")
返回false,则根本不会评估以下条件。因此,在我看来,只需要使用第一个。它更清楚。
答案 2 :(得分:2)
如上所述,短路将导致程序在条件失败时退出if语句,这意味着不会评估任何其他条件,因此两种格式的评估方式没有实际区别。
我想要注意的是,当你有几个if语句嵌套在一起时,代码易读性会受到负面影响,这对我来说是不嵌套的主要原因。例如:
if( conditionA && conditionaB && !conditionC ){
// Do Something
}
比以下更清洁:
if( conditionA ){
if( conditionB ){
if( !conditionC ){
// Do Something
}
}
}
想象一下,有20个嵌套的if语句?当然不是常见的事情,但可能。
答案 3 :(得分:1)
他们是一样的。对于第一个示例,如果第一个表达式为false,则任何现代运行时都将忽略第二个表达式。
答案 4 :(得分:1)
短路效果更好,由&&和如果您检查值为null,然后对该对象应用函数,则短路运算符效果很好。如果条件1为假,则从条件2停止执行。
前:
String s=null;
if(s!=null && s.length())
这不会引发异常,并且在大多数情况下,如果检查则再保存一个。
答案 5 :(得分:0)
如果条件的顺序相同,则它们的效率完全相同。
if (command.equals("sort") && args.length == 2)
如果command.squals(“sort”)返回false,则将退出,并且永远不会检查args.length。这是short-circuit
运算符的&&
运算。
归结为风格和可读性问题。 IMO当您在单个if
语句中开始链接太多时,很难阅读。
答案 6 :(得分:0)
实际上,它被称为[Lazy_evaluation]:http://en.wikipedia.org/wiki/Lazy_evaluation
答案 7 :(得分:0)
这不是真正的问题,但请注意,如果你想要评估这两个,你可以使用& :
if (methodA() & methodB()) {
//
}
而不是
boolean a = methodA();
boolean b = methodB();
if (a && b) {
//
}
答案 8 :(得分:-1)
"sort".equals(command)
在这种情况下,但在将来可能没有意义。首先使用静态类型,这样您就不需要在
之前进行空检查