Comparações com o método [b]equals[/b] e com o operador [b]==[/b]
Resumindo antes para depois explicar....
equals --> Comparações dentro do Heap da JVM
== --> Comparações fora do Heap da JVM
[b]O que é o Heap?[/b]
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.
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 [b]fora do heap[/b]
Entao.... no caso disso:
int a = 1;
int b = 1;
if (a == b) {
//instrucao
}
é 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 [b]true[/b]
Já no caso da comparacao de OBJETOS, utilizando o '==' ficaria desta forma:
MeuObjeto obj1 = new MeuObjeto("Java");
MeuObjeto obj2 = new MeuObjeto("Free");
if (obj1 == obj2) {
//instrucao
}
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:
[b]"A referencia obj1 aponta para um objeto no Heap, e a referencia obj2 tambem aponta para um objeto no Heap, esses 2 objetos, [u]SAO O MESMO OBJETO[/u]?"[/b]
Ai a jvm obviamente vai retornar false, pq cada um eh um objeto ("java" != "free")...
agora no caso:
MeuObjeto obj1 = new MeuObjeto("Lucas");
MeuObjeto obj2 = obj1;
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:
System.out.println( obj2.getNome() );
provavelmente eu teria a saida: Lucas
:o :o
Continuando com esse exemplo, se eu efetuasse a comparacao, ficaria assim:
if (ob1 == obj2) {
//instrucao
}
Ai sim, a saida seria [b]true[/b] pois a referencia aponta para o mesmo objeto....
**** Comparacao utilizando 'equals'' ****
É o [i]_inverso_[/i] da '==' compara os objetos dentro do heap, ou seja.... suas caracteristicas...
um exemplo básico e auto-explicativo seria.....
String nome1 = "Lucas";
String nome2 = "Jose";
if (nome1.equals(nome2)) {
//isntrucao
}
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:
public class Pessoa extends Object implements Serializable {
private int idade;
private String nome;
public Pessoa() {
setIdade(0);
setNome("Alguem");
}
public void setIdade(int i) {
if (idade < 0) throw new RuntimeException("Idade Negativa");
else this.idade = i;
}
public void setNome(String n) {
//checo se a referencia para o nome existe...
if (n == null) throw new RuntimeException("Nome Invalido");
else this.nome = n;
}
public String getNome() {
return nome;
}
public int getIdade() {
return idade;
}
public boolean equals(Pessoa p) {
boolean ret = false;
if ( (this.nome.equals(p.getNome())) && (this.idade == p.getIdade()) )
ret = true;
return ret;
}
}
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: