Cara, fiz uns testes aqui e cheguei à seguinte conclusão:
Ao comparar classes comuns, como a Apren, por exemplo, tanto a igualdade ( == ) como o método ( equals() ) comparam as referências do objeto. Se referenciarem o mesmo objeto, são iguais.
Porém, quando se trata de classes wrapper, as empacotadoras de tipo (Integer, Double, etc… ) a igualdade continua comparando as referências, mas o método compara o conteúdo, como sendo do tipo primitivo.
Isso explica a situação, mas não garanto a veracidade.
Espero ter ajudado!
Quaisquer observações - correções e/ou acréscimos - são bem-vindas.
danieldestro
Voce precisa implementar o seu equals(), caso contrário ele usa o definido em Object.
Paulo_Silveira
e o que esta definido em Object faz this==o por default
LPJava
hum eu acho que isso mesmo que o Reilander falou… entao para retornar true daniel eu teria que implementar o metodo equal senao vai ficar false pois a comparacao ai eh de referencia confere?
ae pessoal a sintaxe abaixo esqueça os comentarios… acabei de implementar o metodo equals como o daniel citou mais nao compila pq?
classUlt{publicbooleanequals(Objectobj){if((objinstanceofUlt)){returntrue;}}publicstaticvoidmain(Stringargs[]){Ultu=newUlt();Ultut=newUlt();Integerit=newInteger(5);Integerite=newInteger(5);//testando a instancia da class - referencia dos objetos == System.out.println(u==ut);//falseSystem.out.println(u.equals(ut));//false//testando de uma class wrapper - nao compara as referencias e sim o valorSystem.out.println(it==ite);//- falseSystem.out.println(it.equals(ite));//true}}
:?
ACDias
Porque o método equals que você implementou pode não retornar nada. Veja: você declarou que ele deve retornar boolean, porém se no fluxo de execução ele não entrar no if ele não vai retornar nada correto?
LPJava
ahh entao teria q colocar um return fora do if… caso ele nao entre correto?
ACDias
Sim
Reilander
Se o teste do if falhar, o retorno apropriado não é encontrado, exatamente como o ACDias falou. Só é possível não “garantir” o retorno com uma instrução “return” quando o tipo do retorno do método é void. Ainda assim, você pode retornar no “meio” do método com “return;”, que interromperá o fluxo do método, devolvendo o controle do programa ao método chamador.
antoniopopete
Seu metodo equals por sinal esta mal implementado pois o mesmo diz que se a objeto é daquele tipo,ele é igual,so q sabemos que não é assim que funciona,porque podemos ter 10 objetos da mesma classes que são diferentes entre si.
Uma sugestão de implementação do metodo euals,seria voce usar atributos da classe…Exemplo,verificar cnpj,se forem iguais,retorna true,senao retorna false…E assim por diante…
O metodo equals herdado de Object realmente verifica a referencia e tem efeito similar ao == entre objetos.
LPJava
olha o que fiz com a class: esqueça os comentarios
classUlt{publicbooleanequals(Objectobj){if((objinstanceofUlt)){returntrue;}returnfalse;}publicstaticvoidmain(Stringargs[]){Ultu=newUlt();Ultut=newUlt();Integerit=newInteger(5);Integerite=newInteger(6);//testando a instancia da class - referencia dos objetos == System.out.println(u==ut);//falseSystem.out.println(u.equals(ut));//false//testando de uma class wrapper - nao compara as referencias e sim o valorSystem.out.println(it==ite);//- falseSystem.out.println(it.equals(ite));//true}}
é isso?
danieldestro
Falta mais, camilo.
Esse verificação que você fez é exatamente igual fazer:
if(u.getClass().equals(ul.getClass())){}
O ideal do método equals() é verificar alguma igualdade entre os objetos, principalmente quanto a valores internos ou a identidade do mesmo.
Exemplo:
publicclassPessoa{privateintid;// get e set de IDpublicbooleanequals(Objecto){if(o!=null&&(ointanceofPessoa)&&((Pessoa)o).getId()==this.id){returntrue;}returnfalse;}}
Neste caso ele fala que "pessoas" com o mesmo "id" são objetos iguais.
antoniopopete
Eu acho Camilo que você está fazendo um pouco de confusão.
O método equals serve para verificar se DUAS INSTÂNCIAS da mesma classe (ou via herança) são iguais a partir de um critério, que é escrito dentro desse método.
Por exemplo, o equals de String,faz uma analise lexográfica das duas instâncias e somente é igual se as duas são iguais lexograficamente.
Dois Integer,só são iguais se possuem o mesmo valor inteiro.
E sua classe Pessoa?
Se possuem o mesmo cpf?O mesmo nome?A mesma idade?
Ai depende de sua classe e de seu projeto.
Então,em minha opnião,deve esquecer esse lance de “if instanceof Pessoa = true”…Porque com isso,você está dizendo que todas instãncias de sua classe,são iguais…Entendeu?
Espero ter ajudado…
LPJava
eh antonio estava lendo ontem a noite, e vi que as wrappers eh avaliado o valor passado no arg
Só lembrando que embora esse cache seja interessante, ele não é garantido pela JVM. Os implementadores podem amplia-lo ou simplesmente remove-lo nas próximas versões (ou em versões de diferentes SOs).
Via de regra, não conte com ele. Sua aplicação deve considerar para todos os efeitos que ele não existe.
LPJava
boa colocação vinny a kathy fala um trecho sobre isso