Creo que mi respuesta puede ser más comprensible:
Hay dos diferencias entre &y &&.
Si usan como lógico Y
&y &&puede ser lógico AND, cuando el resultado de la expresión izquierda &o &&derecha es verdadero, todo el resultado de la operación puede ser verdadero.
cuando &y &&como es lógico AND, hay una diferencia:
cuando se usa &&como lógico AND, si el resultado de la expresión izquierda es falso, la expresión derecha no se ejecutará.
Toma el ejemplo:
String str = null;
if(str!=null && !str.equals("")){ // the right expression will not execute
}
Si usa &:
String str = null;
if(str!=null & !str.equals("")){ // the right expression will execute, and throw the NullPointerException
}
Otro ejemplo más:
int x = 0;
int y = 2;
if(x==0 & ++y>2){
System.out.print(“y=”+y); // print is: y=3
}
int x = 0;
int y = 2;
if(x==0 && ++y>2){
System.out.print(“y=”+y); // print is: y=2
}
& se puede utilizar como operador de bits
&se puede usar como ANDoperador Bitwise , &&no se puede.
El operador AND "&" bit a bit produce 1 si y solo si ambos bits en sus operandos son 1. Sin embargo, si ambos bits son 0 o ambos bits son diferentes, entonces este operador produce 0. Para ser más preciso a nivel bit Y el operador "&" devuelve 1 si alguno de los dos bits es 1 y devuelve 0 si alguno de los bits es 0.
Desde la página wiki:
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml