Diferença entre o operador == e o método equals

    • == é um operador, ou seja, é um símbolo que pertence à linguagem JAVA e é reconhecida pelos compiladores.

    • Para os tipos primitivos o operador == compara os valores normalmente;
    • Já para classes o operador == verifica se uma classe é exatamente igual a outra;
    • No caso de String, compara a referência, mesmo que os textos sejam iguais, estando em lugares diferentes na memória, ele falhará ao compará-los. Ou seja, ele não verifica se dois objetos têm o mesmo valor.

* Tipos primitivos são tipos pré-definidos pela linguagem Java e seus nomes são reservados, similar ao que ocorre com os operadores. Estes são os tipos primitivos: byte, short, int, long, float, double, char e boolean.

    • equals é um método que pertence à classe Object, que retorna um valor boleano (boolean) e pode ser reescrito em qualquer classe.

    • Como ele pode ser sobrescrito, dependendo da implementação, pode executar ações diferentes;
    • No caso de String, ele compara o conteúdo e não a referência;

Vamos realizar um teste prático:

1) Crie um arquivo chamado Comparacao.java e salve com o seguinte código em Java:

public class Comparacao {

public static void main(String []args) {

/*

Note que as variáveis 1, 2, 3 e 4 são criadas pelo compilador, que percebe que são iguais,

criando apenas uma área da memória com o texto "abcdef" e associando ele para as 4 primeiras

variáveis

*/

String var1 = "abcdef";

String var2 = "abc" + "def";

String var3 = "" + "abcdef";

String var4 = "abcdef" + "";

/*

As variável 5 é criada durante a execução, pois no momento da compilação o seu conteúdo não é

conhecido, então o texto "abcdef" será montado em outra área de memória

*/

String var5 = var1 + "";

String parte1 = "abc";

String parte2 = "def";

/*

Aqui ocorre o mesmo que ocorreu com a variavel 5, ou seja, a variável 6 é composta por duas outras

variáveis, que serão acessadas somente em tempo de execução, sendo criadas em outra área de memória

*/

String var6 = parte1 + parte2;

System.out.println("\n+++ Conteudo das variaveis");

System.out.println("var1-> " + var1);

System.out.println("var2-> " + var2);

System.out.println("var3-> " + var3);

System.out.println("var4-> " + var4);

System.out.println("var5-> " + var5);

System.out.println("var6-> " + var6);

System.out.println("\n+++ Comparacao com ==");

System.out.println("var1==var2 -> " + (var1==var2));

System.out.println("var1==var3 -> " + (var1==var3));

System.out.println("var1==var4 -> " + (var1==var4));

System.out.println("var2==var3 -> " + (var2==var3));

System.out.println("var3==var4 -> " + (var3==var4));

System.out.println("var4==var5 -> " + (var4==var5));

System.out.println("var1==var5 -> " + (var1==var5));

System.out.println("var1==var6 -> " + (var1==var6));

System.out.println("var5==var6 -> " + (var5==var6));

System.out.println("\n+++ Comparacao com equals");

System.out.println("var1.equals(var2) -> " + (var1.equals(var2)));

System.out.println("var1.equals(var3) -> " + (var1.equals(var3)));

System.out.println("var1.equals(var4) -> " + (var1.equals(var4)));

System.out.println("var2.equals(var3) -> " + (var2.equals(var3)));

System.out.println("var3.equals(var4) -> " + (var3.equals(var4)));

System.out.println("var4.equals(var5) -> " + (var4.equals(var5)));

System.out.println("var1.equals(var5) -> " + (var1.equals(var5)));

System.out.println("var1.equals(var6) -> " + (var1.equals(var6)));

System.out.println("var5.equals(var6) -> " + (var5.equals(var6)));

}

}

2) Compile o seu programa:

javac Comparacao.java

3) Execute o seu programa:

java Comparacao

5) Teremos o seguinte resultado:

+++ Conteudo das variaveis

var1-> abcdef

var2-> abcdef

var3-> abcdef

var4-> abcdef

var5-> abcdef

var6-> abcdef

+++ Comparacao com ==

var1==var2 -> true

var1==var3 -> true

var1==var4 -> true

var2==var3 -> true

var3==var4 -> true

var4==var5 -> false

var1==var5 -> false

var1==var6 -> false

var5==var6 -> false

+++ Comparacao com equals

var1.equals(var2) -> true

var1.equals(var3) -> true

var1.equals(var4) -> true

var2.equals(var3) -> true

var3.equals(var4) -> true

var4.equals(var5) -> true

var1.equals(var5) -> true

var1.equals(var6) -> true

var5.equals(var6) -> true

Conclusões:

Sobre o operador ==

    • Todas as variáveis são exatamentes iguais, em relação ao seu conteúdo;
    • Somente as variáveis criadas em tempo de execução são diferentes (4,5 e 6), pois foram criadas em tempo de execução;

Método equals

    • Como compara o conteúdo de cada uma, são todas iguais.