可能重复:
Difference in & and &&
if (true && true) {
System.out.println("test if");
}
if (true & true) {
System.out.println("test if");
}
两者都给出相同的输出。为什么?
答案 0 :(得分:5)
&&
短路,而&
没有。例如:
if (methodA() && methodB()) {
...
}
在这种情况下,如果methodA
已经返回false,则不会调用methodB
。形式上,如果您有表达式a && b
,则b
仅在a
评估为true
的情况下进行评估。
除了明显的性能优势外,这对null
检查特别有用:
if (x != null && x.getSomeValue()) {
...
}
如果您在此使用单&
,即使x.getSomeValue()
为x
,也会评估null
,从而导致异常。
答案 1 :(得分:1)
在第一种情况下,您不测试if的第二部分:&&
运算符从左到右执行,并在第一个false
值处停止。
在这种情况下,这可能很有用:
if (a!=null && a.doSomething()==23) {
因为它可以防止nullPointerException。
测试布尔条件时,请始终使用&&
。
答案 2 :(得分:1)
答案 3 :(得分:1)
请参阅: http://www.jguru.com/faq/view.jsp?EID=16530
这取决于参数的类型......
对于整数参数,单个&符号(“&”)是“按位AND” 运营商。双&符号(“&&”)没有为任何东西定义 两个布尔参数。
对于布尔参数,单个&符号构成 (无条件)“逻辑AND”运算符而双符号 (“&&”)是“条件逻辑AND”运算符。也就是说 单个&符号总是评估两个参数而不是 如果是第一个,则双符号只会评估第二个参数 论证是真的。
对于所有其他参数类型和组合,编译时错误 应该发生。
答案 4 :(得分:0)
In&它会检查左侧和右侧的陈述。并且&&将仅检查声明的一方(如果一方是真的,则不会检查另一方)
答案 5 :(得分:0)
答案 6 :(得分:0)
&安培;&安培;是合乎逻辑的。 真实&&是真的,其他一切都是假的。 &安培;是按位的。 (10& 8)= 8