Se não sobreescrever o metodo equals, posso usar um objeto com chave em uma tabela hashing?

Boa a noite a todos,

estou estudando e o livro fala que se eu nao sobreescrever o metodo equals, eu não posso usar um objeto como chave em uma tabela hashing (Livro da Kathy Sierra, pagina 303), porem eu nao entendi o porque. Alguem pode me explicar ? Se eu não sobreescrever esse metodo, caso eu tenha dois objetos e coloque os dois em uma tabala hashing (HashMap ???), um sobreescreve o outro ?

Para tentar entender eu criei os seguintes codigos:

class Teste {

	private String nome;

	Teste(String nome) {
		this.nome = nome;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Teste) {
			Teste testeAux = (Teste) obj;
			if (testeAux.nome.equals(this.nome)) {
				return true;
			} else {
				return false;
			}
		}
		return false;
	}
}
class TesteSemEquals {

	private String nome;

	TesteSemEquals(String nome) {
		this.nome = nome;
	}

}

public class TesteEquals {

	public static void main(String[] args) {
		{
			Teste teste1 = new Teste("teste");
			Teste teste2 = new Teste("teste");

			HashMap<Teste, String> mapa = new HashMap<Teste, String>();
			mapa.put(teste1, "teste1");
			mapa.put(teste2, "teste2");
			System.out.println(mapa.get(teste2));
			System.out.println(mapa.get(teste1));
		}
		{
			TesteComHashCode teste1 = new TesteComHashCode("teste");
			TesteComHashCode teste2 = new TesteComHashCode("teste");

			HashMap<TesteComHashCode, String> mapa = new HashMap<TesteComHashCode, String>();
			mapa.put(teste1, "teste1");
			mapa.put(teste2, "teste2");
			System.out.println(mapa.get(teste2));
			System.out.println(mapa.get(teste1));
		}
	}
}

resultado:

teste2
teste1
teste2
teste1

Obrigado a todos !!!

O HashMap é formado por Map.Entry’s, que seguram uma chave e um valor. Quando chamamos o método put, passamos uma chave e um valor. Se a chave ainda não estiver no mapa, é criado um novo Entry com a chave e o valor passado. Caso a chave já esteja no mapa, o valor antigo que estava associado a chave é reposto pelo novo valor que está sendo passado no parâmetro. E para verificar se a chave já existe, é considerado seu hashCode e o método equals (não tenho certeza absoluta se o método equals é considerado, mas acho que é).

Quando se implementa o método equals, é importante que se implemente o método hashCode também. Tem um tópico que o ViniGodoy dá uma excelente explicação sobre o hash code e como gerá-lo corretamente, se eu achar eu posto o link aqui.

Achei:

http://www.guj.com.br/java/52485-hashcode-duvida#276120

http://www.guj.com.br/java/101275-como-sobre-escrever-corretamente-hashcode-#546125

Não sei se você já leu o trecho que ela fala sobre hashCode mas você vai notar que em algum momento ela fala que se você não sobrescrever equals e hashCode você vai ter elementos duplicados em tabelas hash. Eu duvidei dela quando li e testei XD, ela disse a verdade, como não conheço como o método hashCode é implementado em Object então não sei dizer porque é preciso sobrescrever tal método além de equals …“deve ser porque ele não procura no bucket correto”
Voltando ao porque sobrescrever equals é porque em tabelas de espalhamento é preciso do hashCode para saber em qual bucket está o elemento a ser retornado, mas também, é preciso uma forma de saber se dado um elemento tal elemento é equivalentemente igual à algum elemento daquele bucket

Imagine vários sacos cada um com vários brinquedos dentro, cada saco é referenciado por um número(hashCode). Agora imagine que você precise de um brinquedo de saco específico, você sabe em qual saco o brinquedo está porque você tem o número do saco, mas, como você vai saber qual brinquedo dentro de tal saco é aquele que você precisa? equals está ai para te ajudar =)

Pra mim a explicação parece clara mas é preciso que você leia sobre hashCode para ficar mais claro

espero ter ajudado um pouco

A implementação de equals e hashCode de Object consideram a referência do objeto. Portanto se o método equals for implementado para verificar o conteúdo do objeto, hashCode também deve ser implementado para gerar o número de acordo com o conteúdo do objeto.

Valeu Eric, vou ler (amanha e sem estar com sono) !!

mapleplayer, se eu só sobreescrever o equal vou ter elementos duplicados? se eu sobreescrever só o hashcode eu tambem vou ter elementos duplicados ?
Tem mais alguma implicação se eu só sobreescrever um desses metodos e nao sobreescrever o outro ? (Caso a resposta estaja em um dos links…desculpe).

Valeu galera.

Dê uma olhada aqui: http://sergiotaborda.wordpress.com/desenvolvimento-de-software/java/colecoes-em-java/

Fala sobre collections e tem uma parte destinada ao equals e hashCode.

Se você sobrescrever apenas um dos dois então você terá elementos duplicados em tabelas hash, é preciso sobrescrever os dois para funcionar como o esperado