Javafree

Comparar variáveis: == ou .equals() ???

Publicado por lucastex em 21/12/2013 - 222.864 visualizações

Comparações com o método equals e com o operador ==

Resumindo antes para depois explicar....

equals --> Comparações dentro do Heap da JVM
== --> Comparações fora do Heap da JVM

Quote:
O que é o Heap?

O Heap é um local reservado e protegido da JVM (Java Virtual Machine) onde ficam alocados todos os objetos instanciados durante a execução de seu programa... cada um destes objetos possui um endereco de memoria onde está armazenado, e o unico acesso a ele, é por via de uma referencia (armazenada fora do heap).... Esta referencia, também possui o endereco de memoria, tornando o seu acesso unico e exclusivo a este objeto.


Quote:
lembre-se que tipos primitivos (int, double, float) tambem ficam fora do HEAP com as referencias para objetos


**** Comparacao utilizando '==' ****

quando voce usa o operador "==" para comparar.... voce está comparando fora do heap

Entao.... no caso disso:



é uma comparacao externa ao heap da jvm, ou seja, vai comparar os tipos primitivos, ou seja, se o valor em 'a' eh o mesmo valor em 'b'...
resultando é claro, em true

Já no caso da comparacao de OBJETOS, utilizando o '==' ficaria desta forma:



Ai voce está comparando os objetos fora do heap, ou seja, comparando apenas suas referencias.......

Resultando na seguinte pergunta para a jvm em tempo de execucao:

Quote:
"A referencia obj1 aponta para um objeto no Heap, e a referencia obj2 tambem aponta para um objeto no Heap, esses 2 objetos, SAO O MESMO OBJETO?"


Ai a jvm obviamente vai retornar false, pq cada um eh um objeto ("java" != "free")...

agora no caso:



O que eu fiz, foi instanciar um novo "MeuObjeto" (dentro do heap) e apontar obj1 (fora do heap) para ele.... depois criei uma nova referencia (fora do heap) chamada obj2, e apontei para obj1... ou seja... para o mesmo objeto.....

exemplo de que eh o mesmo objeto, se eu fizer:



provavelmente eu teria a saida: Lucas

:o :o

Continuando com esse exemplo, se eu efetuasse a comparacao, ficaria assim:



Ai sim, a saida seria true pois a referencia aponta para o mesmo objeto....

**** Comparacao utilizando 'equals'' ****

É o _inverso_ da '==' compara os objetos dentro do heap, ou seja.... suas caracteristicas...

um exemplo básico e auto-explicativo seria.....



Ai sim, seria false, pois o VALOR das 2 sao diferentes...

Por isso que é ideal quando criamos (minha opiniao) um novo objeto, do tipo por exemplo, PESSOA, sobrescrevermos o metodo 'equals' herdado de Object..... para podermos ver se as pessoas sao iguais.....

exemplo básico e tosco:



O ideal seria também uma implementação do metodo hashcode, mas fica para a próxima....

:!: :!: :!:

Deu pra entender????

Abraços a todos do JF!

:!: :!: :!: :!: :!: :!:
:o :o :o


:!: :!:
:metal: