hashCode() duvida  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

ae pessoal no cap 7 do livro da kathy ela fala que, objetos iguais devem ter o hashing iguais.. bom teoricamente ela explicou bem.. mais nao explicou a implementação do ou seja como cumprir com o contrato.. fiquei nessa duvida veja na sintaxe abaixo...


porem queria saber de os codigos dos objetos sao iguais.. implementado o hashCode() mais nem sei por onde ir.. quem puder dar esse help

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Tio, é hashCode ou hasCode? Hein?
[WWW]
felixcomputer
JavaTeenager
[Avatar]

Membro desde: 07/06/2006 11:12:19
Mensagens: 171
Localização: Belém - Pa
Offline

Camilo, não sei se entendi a sua duvida, mas quando sobrescrevemos o equals, é seguro sobrescrever o hashcode tbem, para que os mesmos objetos tenham hashcode iguais, para saber o hascode dos objetos basta fazer isso:


Espero ter ajudado em alguma coisa...

Samuel Félix
O temor do Senhor é o principio da sabedoria!
http://sfelixjr.googlepages.com
[Email] [WWW] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Existem várias formas de se implementar um hashcode. Uma delas, sugerida no livro Effective Java, capítulo 3, item 8, que pode ser lido nesse link (eu recomendo fortemente que você leia o livro todo):
http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

Ele diz o seguinte:
1. Armazene algum valor constante, diferente de zero (por exemplo, 17);
2. Pegue todos os atributos relevantes para sua classe (geralmente são aqueles usados no equals, para saber se o objeto é igual ao outro). Para cada um deles faça, calcule um hashcode inteiro c:
i. Se o campo é boolean, compute (f ? 0 : 1);
ii. Se o campo é um byte, char, short ou int, compute (int)f;
iii. Se o campo é um long, compute (int)(f ^ (f >>> 32));
iv. Se o campo é um float, compute Float.floatToBits(f);
v. Se o campo é um double, compute Double.doubleToLongBits(f) e use o hash para longs no resultado descrito no passo iii.
vi. Se o campo é um objeto, e ele é nulo, compute 0. Caso contrário, use o hashcode desse objeto. Se uma comparação mais profunda é necessária, crie uma "representação canônica" para essa classe, e use o hash dessa representação.
vii. Se o campo é um array, trate-o como se cada elemento fosse um campo separado.
3. Combine o hashcode c calculado para cada elemento num resultado como descrito:
result = 37 * result + c;
4. Retorne o resultado.

No caso de sua classe, você poderia simplesmente retornar n. Afinal ele é o único atributo e define a igualdade. Entretanto, só para exemplificar, usando o algoritmo descrito acima, teríamos:



Supondo que você acrescentasse ainda um outro atributo s, do tipo String, seu código ficaria assim:



Esse algoritmo não é o estado da arte de um hashcode, mas é suficientemente rápido, fácil de implementar e bastante confiável.

Por fim, o eclipse gera automaticamente esse algoritmo, para todos os campos de sua classe, se você usar a opção source->generate hashcode and equals.

Novamente, dê uma lida no capítulo que eu coloquei o link, para mais considerações e exemplos do uso de hashcode.


Alguns meses depois, postei no GUJ uma classe que implementa esse algorítmo:
http://www.guj.com.br/java/101275-como-sobre-escrever-corretamente-hashcode-#546125

This message was edited 1 time. Last update was at 21/07/2011 16:33:42

[WWW]
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

ae.. galera valeu..mais fiquei na duvida agora veja como ficou meu codigo:


ele imprime o codigo hashinh mais se eu mandar imprimir o h1.hashCode() pq o valor eh diferente ja que os objetos sao equivalentes?

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
Deh
JavaGuru
[Avatar]

Membro desde: 18/04/2006 23:02:24
Mensagens: 244
Localização: Florianópolis - SC
Offline

Pela Api,
Java API wrote:
As much as is reasonably practical, the hashCode method defined by
* class Object does return distinct integers for distinct
* objects. (This is typically implemented by converting the internal
* address of the object into an integer, but this implementation
* technique is not required by the
* JavaTM programming language.)


hashCode() da java.lang.Object é native, e ela dá o valor 'int' pegando o endereço do objeto para um int... dois objetos diferentes, dois lugares diferentes da memória...
por isso o hashCode() resulta em valores diferentes... você deveria sobreescrever o "public int hashCode()" para ter o comportamento correto. =]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Camilo, assim como você fez com o equals, você deve sobrescrever o método hashcode. Aliás, o título do capítulo do Effective java que te sugeri já diz tudo: "Sempre sobrescreva o hashCode se você sobrescrever o equals".

O método hashcode default não tem como adivinhar que você sobrescreveu o equals. E mesmo que tivesse, ele não teria como adivinhar que regra você colocou lá dentro.

No meu post anterior eu te sugeri um algoritmo mais ou menos genérico de como fazer o seu próprio método hashCode, o mesmo usado no Effective Java.

No caso da sua classe, você pode muda-la para:
[WWW]
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

po galera vaelu entao.. conseguir entender.. so para resumir.. eu posso definir o codigo do meu hashCode() caso venha subscrever ele certo? com as explicacoes de vcs implementei o codigo abaixo:


flw! mesmo.. vinny vc anda sumido heim..trabalhando muito pelo visto!!

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team