[Dúvida sobrescrição do método equals]

3 respostas
G

Olá pessoal, estou fazendo alguns testes com a classe HashSet e encontrei um problema, na verdade não é bem um problema é uma dúvida quanto a sobrescrição do método equals.
No meu modo de ver, assim que um objeto é adicionado ao HashSet, ele chama os métodos hashCode() e equals() para conferir onde e se deve alocar esse objeto, correto?

Na realização dos meus testes, inseri um syso("") nos métodos equals() e hashCode().
O syso(""); do hashCode ele chama normalmente (me traz uma resposta no console), porém não chama o do equals(), alguém poderia me explicar porque isso acontece?

Segue o código abaixo:

import java.util.HashSet;

class Person {
	String name;

	public Person(String name) {
		this.name = name;
	}
	
	@Override
	public int hashCode() {
		System.out.println("call hash"); <= esse  chamado normalmente
		return 1;
	}
	
	@Override
	public boolean equals(Object o)  {
		System.out.println("call equals"); <=  na saída não não chama esse método
		return false;
	}
	
	public String toString(){
		return name;
	}
}

public class TestePerson {
	public static void main(String[] args) {
		
		HashSet<Person> a = new HashSet<Person>();
		
		
		Person p = new Person("a");
		Person c = new Person("a");
		
		
		//System.out.println(p.equals(p));
	
		a.add(p);		
		a.add(p);		
		
		
		System.out.println(a);
	}
}

Estou começando a duvidar que esse código está chamando o método equals() de Object.
Alguém pode me ajudar?

Grato.
Abs.

3 Respostas

G

Substitua o método:

public int hashCode() {
	System.out.println("testeHash ");
	return 1;
}

por

public int hashCode() {
		System.out.println("hash");
		return (int) Math.floor(Math.random() * 1000);
	}

Mesmo os objetos sendo iguais ele adiciona no Set…
Eu sei que é inconsistente, mais meu interesse é saber porque o método equals() não é chamado

Grato.

F

Não sei se você ainda permanece com essa dúvida ou não, mas enfim tente instanciar dois objetos e depois utilize as variáveis de referência com o
equals, que irá entrar dentro do seu método override da sua classe.

Segue como exemplo:

Test equals1 = new Test();
		Test equal2 = new Test();
if (equals1.equals(equal2)) {
			System.out.println("Equals Ok");
		}

Lembrando que para ficar mais interessante tente sempre realizar algum cast com o Object do método equals.

@Override
	public boolean equals(Object obj) {

		return ((Pessoa) obj).getNome().equals(this.nome);

	}
WellingtonRamos

Primeiramente, utilize a tag [ code ] (há um botão acima da composição da mensagem que faz isso).

Acontece que vc está passando a mesma referência:
a.add(p); 
a.add(p);
Fiz um teste aqui com:
a.add(new Person()); 
a.add(new Person());
e funcionou.
public class Teste {

	static class A {
		@Override
		public int hashCode() {
		    System.out.println("testeHash ");
			return 1;
		}
		@Override
		public boolean equals(Object obj) {
		    System.out.println("testeEquals");
		    return false;
		}
		
		@Override
		public String toString() {
		    return "My hash is " + hashCode();
		}
	}
	
	public static void main(String[] args) {
		
		
		Set<A> s = new HashSet<A>();
		A a = new A();
		A ah = new A();
		s.add(a);
		s.add(ah);
		
		System.out.println(s);
		System.out.println();		

		Set<A> b = new HashSet<A>();
		A a1 = new A();
		b.add(a1);
		b.add(a1);
		
		System.out.println(b);
	}
}
Criado 10 de maio de 2010
Ultima resposta 10 de mai. de 2010
Respostas 3
Participantes 3