让我说我有这个:
if(bool1 && bool2 && bool3) {
...
}
Run Code Online (Sandbox Code Playgroud)
现在.如果bool1被评估为false,Java是否足够聪明,可以跳过检查bool2和bool2?java甚至从左到右检查它们?我问这个是因为我正在"排序"我的if中的条件到它们所需要的时间(从左边最便宜的那个开始).现在我不确定这是否给了我任何性能优势,因为我不知道Java如何处理这个问题.
Tom*_*icz 33
是的,Java(类似于其他主流语言)使用惰性评估短路,这意味着它尽可能少地进行评估.
这意味着以下代码是完全安全的:
if(p != null && p.getAge() > 10)
Run Code Online (Sandbox Code Playgroud)
此外,a || b永远不会评估b是否a评估true.
Pet*_*rey 14
如果bool1被评估为false,Java是否足够聪明,可以跳过检查bool2和bool2?
它不是一个聪明的问题,它是语言中规定的要求.否则你不能写像这样的表达式.
if(s != null && s.length() > 0)
Run Code Online (Sandbox Code Playgroud)
要么
if(s == null || s.length() == 0)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你使用&和|它总是计算表达式的两侧.
请查看 Java 之间&和之间的区别&&(同样适用于|和||).
&而|在刚刚逻辑运算符,而&&和||是有条件的逻辑运算符,它在你的榜样意味着
if(bool1 && bool2 && bool3) {
Run Code Online (Sandbox Code Playgroud)
将跳过bool2,bool3如果bool1是假,和
if(bool1 & bool2 & bool3) {
Run Code Online (Sandbox Code Playgroud)
将评估所有条件,无论其价值如何.
例如,给定:
boolean foo() {
System.out.println("foo");
return true;
}
Run Code Online (Sandbox Code Playgroud)
if(foo() | foo())将打印foo 两次,if(foo() || foo())- 只需一次.