hashCode()

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());
	}

}

:?:

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?

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…

[quote=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…[/quote]

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.

[quote=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…[/quote]

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;
	}

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?

Nao seria um Overwriting ?? =PP.

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.

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…

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

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