Os caracteres && são usados para o E e os caracteres || são usados para o OU.
Entretanto existem outros operadores lógicos: o &, o | e o ^.
Qual a diferença do & para o &&? Do | para o ||? E o que é ^? Esse não é o sinal de exponenciação?
Uma coisa de cada vez, mas não, o sinal ^ não serve para exponenciação. Use Math.pow(x, y) para x elevado a y.
Voltando aos operadores...
Quando usamos o sinal duplicado (&& ou ||), significa que o Java vai testar a segunda condição somente se a primeira não definir o resultado. Quando usamos o sinal simples (& ou |) significa que o Java vai, obrigatoriamente, testar as duas condições. Já o sinal ^ refere-se ao XOR (exclusive OR/ OU exclusivo).
Vamos às tabelinhas (as famosas Tabelas-Verdade que todo mundo adora):
Operador & (e &&)
condicao 1 condicao 2 resultado
false false false
false true false
true false false
true true true
Operador | (e ||)
condicao 1 condicao 2 resultado
false false false
false true true
true false true
true true true
Operador ^
condicao 1 condicao 2 resultado
false false false
false true true
true false true
true true false
E qual a vantagem de usar & ou | ao invés de && ou ||?
Na verdade não há vantagem, a vantagem é justamente o contrário, é melhor usar o sinal duplicado pois o desempenho é melhor (não vai precisar verificar sempre as duas condições).
Então quando usar & ou |?
Quando você quiser que a segunda condição seja avaliada pq ela tem um segundo efeito esperado.
Um exemplo extraído do livro "Java - Como Programar" (Deitel & Deitel):
(aniversario == true) | (++idade >= 65)
aniversario é um booleano, se for verdadeiro a primeira condição é verdadeira (true == true) e se estivéssemos usando || a segunda condição nem seria vista. Mas o incremento na idade está justamente na segunda condição.
Para usar o || no código acima você teria que fazer depois um condicional if (aniversario) ++idade; (ou, de outra forma: if(aniversario == true) ++ idade;)
Preferencialmente, quando do uso de &&, coloque primeiro a condição que tem maior probabilidade de dar FALSE pois, como já foi dito, não vai ser necessário verificar a segunda condição se a primeira for FALSE.