hashCode()

9 respostas
LPJava

ae pessoal como faria para o codigo abaixo retorna o mesmo codigo hashing? fiquei nessa duvida na implementacao da sintaxe… com int é facil mais com String nao conseguir meu equals nesse caso eh true mis os codigos hashing sao diferente…

public class Difhas {
String nome;
	Difhas(String name){
	nome=name;
	}
	public boolean equals(Object o){
		if((o instanceof Difhas)&&(((Difhas)o).nome==this.nome)){
			return true;
		}else{return false;}
	}
	
	public static void main(String[] args) {
		Difhas d = new Difhas("cam");
		Difhas d1 = new Difhas("cam");
		System.out.println(d.equals(d1));
	System.out.println(d.hashCode());
	System.out.println(d1.hashCode());
	}

}

:?:

9 Respostas

bombbr

Você tem que implementar o método hashCode, senão seus objetos d e d1 irão chamar o hashCode de Object que retorna o endereço do objeto na memória.

Entendeu?

LPJava

hum olha ai como fiz:

public class Difhas {
String nome;
	Difhas(String name){
	nome=name;
	}
	public boolean equals(Object o){
		if((o instanceof Difhas)&&(((Difhas)o).nome==this.nome)){
			return true;
		}else{return false;}
	}
	public int hashCode(){
		return nome.hashCode();
	}
	
	public static void main(String[] args) {
		Difhas d = new Difhas("cam");
		Difhas d1 = new Difhas("cam");
		System.out.println(d.equals(d1));
	System.out.println(d.hashCode());
	System.out.println(d1.hashCode());
	}

}

mas assim, vamos dizer que tenho “cam” e “mac” como faria para ele retornar o mesmo hashing sendo que q cam e mac saos usam as mesma letras entao o hashing deveria ser igual…

public class Difhas {
String nome;
	Difhas(String name){
	nome=name;
	}
	public boolean equals(Object o){
		if((o instanceof Difhas)&&(((Difhas)o).nome==this.nome)){
			return true;
		}else{return false;}
	}
	
	
	public static void main(String[] args) {
		Difhas d = new Difhas("cam");
		Difhas d1 = new Difhas("mac");
		System.out.println(d.equals(d1));
	System.out.println(d.hashCode());
	System.out.println(d1.hashCode());
	}

}

mudei o valor do contrutor e nao implementei o metodo hashCode mais queria saber na implementacao como faria para que o hashing fosse igual mesmo que os valores sao diferente mas usam as mesmas letras…

bombbr

camilolopes:
hum olha ai como fiz:

mas assim, vamos dizer que tenho “cam” e “mac” como faria para ele retornar o mesmo hashing sendo que q cam e mac saos usam as mesma letras entao o hashing deveria ser igual…

Não necessariamente…devemos ter em mente o seguinte:

se o método obj1.equals(obj2) == true
então
obj1.hashCode() == obj2.hashCode()

Porém se obj1.equals(obj2) == false
então
obj1.hashCode() == obj2.hashCode() OU
obj1.hashCode() != obj2.hashCode()
dependendo da implementação o hash.

camilolopes:

mudei o valor do contrutor e nao implementei o metodo hashCode mais queria saber na implementacao como faria para que o hashing fosse igual mesmo que os valores sao diferente mas usam as mesmas letras…

Para isto vc teria algo como:

public int hashCode(){
		return (nome.charAt(0) + nome.charAt(1) + nome.charAt(2));
	}

Note que esta é uma péssima implementação de hash.

Assim como a implementação abaixo, tbém seria válida porém ineficiente

public int hashCode(){
		return 100;
	}
LPJava

hum entao assim posso ter hascode == e objetos != e ter objetos == e hascode ==, OU ter hashcode != com objetos == ?
tudo depende se eu implementar o metodo hashCode ou nao… se deixar para a jvm ele nunca sera igual a n ser que seja uma String ou um objeto da class Wrapper:Double, Integer?

kaolzz

Nao seria um Overwriting ?? =PP.

ViniGodoy

Camilo a regra é a seguinte:
Sempre que objA.equals(objB), obrigatoriamente, objA.hashCode() == objB.hashCode().

Isso implica na seguinte condição:
Se você implementar equals, você é obrigado a implementar hashCode() para que a condição acima se mantenha.

O que acontece se você ferir essa regra? Todas as classes da Collections Framework deixarão de funcionar!

Isso é explicado com detalhes naqueles capítulos de exemplo que eu te passei, do livro Effective Java.

LPJava

hum entao vou ver a essencia disso quando mexer com framework? pq eu vejo a galera sempre usando o equals() mais pouco implementa o hashCode… sendo que ali o equals eh true mas o hashing diferentes…

1112

Dica: sempre que você sobrescrever o método equals, sobrescreva o método hashcode .

LPJava

hum valeru galera vou fazer isso!! nao fazia… so implementa o equals() fiz um debug no eclipse e vi a essencia! valeu mesmo1 :smiley:

Criado 5 de março de 2007
Ultima resposta 6 de mar. de 2007
Respostas 9
Participantes 5