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.