Eu acho que minha resposta pode ser mais compreensível:
Existem duas diferenças entre &e &&.
Se eles usam como AND lógico
&e &&pode ser lógico AND, quando o &ou &¶ a esquerda e resultar expressão certa tudo é verdadeiro, todo o resultado da operação pode ser verdade.
quando &e &&como lógico AND, há uma diferença:
quando usado &&como lógico AND, se o resultado da expressão esquerda for falso, a expressão correta não será executada.
Veja o exemplo:
String str = null;
if(str!=null && !str.equals("")){ // the right expression will not execute
}
Se estiver usando &:
String str = null;
if(str!=null & !str.equals("")){ // the right expression will execute, and throw the NullPointerException
}
Outro outro exemplo:
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
}
& pode ser usado como operador de bit
&pode ser usado como ANDoperador Bitwise , &&não pode.
O operador AND "&" bit a bit produz 1 se e somente se os dois bits de seus operandos forem 1. No entanto, se os dois bits forem 0 ou os dois bits forem diferentes, esse operador produzirá 0. Para ser mais preciso, o bit a bit O operador AND "&" retorna 1 se qualquer um dos dois bits for 1 e retorna 0 se qualquer um dos bits for 0.
Na página wiki:
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml