运算符类型不同:
&&和||是逻辑运算符,&和|是位运算符。
在使用上,虽然&和|是位运算符,但是对于逻辑的真假true和false来说,在内存中的表示也是用二进制10来标识的,所以把位运算符当成逻辑运算符来使用也是没有问题的。但是他们有一个短路的区别:
举个例子:funA || funB,在funA为true的情况下,funB的结果无论是true还是false,条件的结果永远是true,所以funB这个函数程序不会去执行。这个就叫做短路求值。类似物理中的电流,当某处短路时,电流直接从短路处通过,而不再走另一条路。
而:funA | funB,情况则不同,因为|是位运算符,所以他需要知道左右两遍的具体值,然后进行位运算,虽然结果总是一样的,但是funA和funB两个函数一定都会被执行。
同理&&和&跟上面的例子类似,下面是一个代码测试:
public class Test {
public static void main(String[] args) {
System.out.println(funA(true) || funB(true));
System.out.println();
System.out.println(funA(false) || funB(true));
System.out.println();
System.out.println(funA(true) | funB(true));
System.out.println("-----------------------------");
System.out.println(funA(false) && funB(false));
System.out.println();
System.out.println(funA(true) && funB(false));
System.out.println();
System.out.println(funA(false) & funB(false));
}
public static boolean funA(boolean bool) {
System.out.println("方法A返回结果" + bool);
return bool;
}
public static boolean funB(boolean bool) {
System.out.println("方法B返回结果" + bool);
return bool;
}
}
执行结果:
方法A返回结果true
true
方法A返回结果false
方法B返回结果true
true
方法A返回结果true
方法B返回结果true
true
-----------------------------
方法A返回结果false
false
方法A返回结果true
方法B返回结果false
false
方法A返回结果false
方法B返回结果false
false
总结:为了方便记忆可以这么理解,&&和||因为比较胖不喜欢走动,所以比较懒学会了投机取巧。而&和|比较勤快,每一次都会中规中矩的按流程办事。