Equals()

18 respostas
LPJava

ae pessoal o equals ta me deixando meio confudo:

public class Apren{
	Apren(String s){}
	public static void main(String args[]){
		Apren a = new Apren("lopes");
		Apren b = new Apren("lopes");
		Apren c = a;
		
		System.out.println("(a==b): " + (a==b));
		System.out.println("(a==c): " + (a==c));
		System.out.println("a.equals(b): " + a.equals(b));
		
		Integer i = new Integer(5);
		Integer j = new Integer(5);
		System.out.println("usando Integer");
		System.out.println("i.equals(j): " + i.equals(j));
		System.out.println("(i==j): " + (i==j));
	}
}

no Integer ele retorna true usando o equals Aprend ele retorna false pq isso… essa rebeldia dele… :frowning:

18 Respostas

Reilander

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?

class Ult{
	public boolean equals(Object obj){
		if((obj instanceof Ult)){
		return true;}
		}
	public static void main(String args[]){
		Ult u = new Ult();
		Ult ut = new Ult();
		
		Integer it = new Integer(5);
		Integer ite = new Integer(5);
		//testando a instancia da class - referencia dos objetos == 
		System.out.println(u==ut); //false
		System.out.println(u.equals(ut)); //false
		
		//testando de uma class wrapper - nao compara as referencias  e sim o valor
		System.out.println(it==ite); //- false
		System.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

class Ult{
	public boolean equals(Object obj){
		if((obj instanceof Ult)){
		return true;}
		
		return false;
	}
	public static void main(String args[]){
		Ult u = new Ult();
		Ult ut = new Ult();
		
		Integer it = new Integer(5);
		Integer ite = new Integer(6);
		//testando a instancia da class - referencia dos objetos == 
		System.out.println(u==ut); //false
		System.out.println(u.equals(ut)); //false
		
		//testando de uma class wrapper - nao compara as referencias  e sim o valor
		System.out.println(it==ite); //- false
		System.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:

public class Pessoa {
  private int id;

  // get e set de ID

  public boolean equals( Object o ) {
    if( o!=null && (o intanceof Pessoa) &&
        ((Pessoa)o).getId() == this.id ) {
      return true;
    }
    return false;
  }
}

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

Integer a = new Integer(5);
Integer a1 = new Integer(5);
a=a1 - return true

pois ele vai esta referenciando o mesmo objeto na memoria… ehhe valeu ai! po isso tem q se ligar no exame ta cheio de pegadinha dessas ai :frowning:

guilherme.chapiewski

camilolopes:
eh antonio estava lendo ontem a noite, e vi que as wrappers eh avaliado o valor passado no arg

Integer a = new Integer(5);
Integer a1 = new Integer(5);
a=a1 - return true

pois ele vai esta referenciando o mesmo objeto na memoria… ehhe valeu ai! po isso tem q se ligar no exame ta cheio de pegadinha dessas ai :(

Errado!!!

Faz um teste aí e vai ver que retornará false.

Só retornará true se for Java 5 usando autoboxing:

Integer a1 = new Integer(5);
Integer a2 = new Integer(5);
System.out.println(a1 == a2); // retorna false

Integer b1 = 5;
Integer b2 = 5;
System.out.println(b1 == b2); // retorna true
LPJava

mas guilherme to me referindo ao java 5 mesmo.

antoniopopete

Mas…ele esta fdalando de java 5 mesmo guilherme…

ViniGodoy

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 :smiley:

Criado 30 de janeiro de 2007
Ultima resposta 5 de fev. de 2007
Respostas 18
Participantes 8