Operadores de Igualdade
Determinar a igualdade em Java pode ser um esforço não trivial, pois há uma diferença semântica entre "dois objetos são os mesmos" e "dois objetos são equivalentes". É ainda mais complicado pelo fato de que para primitivos numéricos e booleanos não existe tal distinção.
Vamos começar com o básico, o operador equals(igual) == e o operador not equals(diferente) !=. Como os operadores relacionais, eles comparam dois operandos e retornam um valor booleano se as expressões ou valores são iguais ou diferentes, respectivamente.
Os operadores de igualdade são usados em um dos três cenários:
1. Comparando dois tipos primitivos numéricos. Se os valores numéricos forem de dados diferentes tipos, os valores são promovidos automaticamente conforme descrito anteriormente. Por exemplo, 5 == 5.00 retorna verdadeiro, pois o lado esquerdo é promovido para o double no momento que da comparação.
2. Comparando dois valores booleanos.
3. Comparando dois objetos, incluindo valores null e String.
As comparações de igualdade são limitadas a esses três casos, e você não pode misturar e combinar tipos. Por exemplo, cada um dos seguintes resultaria em um erro do compilador:
boolean x = true == 3; // DOES NOT COMPILE
boolean y = false != "Giraffe"; // DOES NOT COMPILE
boolean z = 3 == "Kangaroo"; // DOES NOT COMPILE
Preste muita atenção aos tipos de dados quando você ver um operador de igualdade no exame. Os criadores do exame também têm o hábito de misturar operadores de atribuição e operadores de igualdade, como a seguir:
boolean y = false;
boolean x = (y = true);
System.out.println(x); // Outputs true
À primeira vista, você pode pensar que a saída deve ser falsa e, se a expressão for (y == true), você estaria correto. Neste exemplo, no entanto, a expressão atribui o valor de true a y e, como você viu na seção sobre operadores de atribuição, a atribuição em si tem o valor da atribuição. Portanto, a saída seria true.
Para comparação de objetos, o operador de igualdade é aplicado às referências aos objetos, não aos objetos para os quais eles apontam. Duas referências são iguais se e somente se apontarem para o mesmo objeto, ou ambas apontarem para null. Vamos dar uma olhada em alguns exemplos:
File x = new File("myFile.txt");
File y = new File("myFile.txt");
File z = x;
System.out.println(x == y); // Outputs false
System.out.println(x == z); // Outputs true
Mesmo que todas as variáveis apontem para a mesma informação de arquivo, apenas duas, x e z são iguais em termos de ==. Neste exemplo, assim como durante o exame OCA, você pode receber nomes de classe que não são familiares, como File. Muitas vezes você pode responder a perguntas sobre essas classes sem conhecer os detalhes específicos dessas classes. Em particular, você deve ser capaz de responder a perguntas que indicam que x e y são dois objetos separados e distintos, mesmo que você não conheça os tipos de dados desses objetos.
No Capítulo 3, "Core Java APIs", continuaremos a discussão sobre a igualdade de objetos, introduzindo o que significa que dois objetos diferentes sejam equivalentes. Também abordamos a igualdade de String e mostramos como isso pode ser um tópico não trivial.