| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 10:26:05
|
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/
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 10:33:22
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Tio, é hashCode ou hasCode? Hein?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 10:38:19
|
felixcomputer
JavaTeenager
![[Avatar]](/images/avatar/6dfc35c47756e962ef055d1049f1f8ec.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 10:48:58
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 11:17:59
|
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/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 11:30:48
|
Deh
JavaGuru
![[Avatar]](/images/avatar/bac4cbb6173335e862a1b3df635ee3ba.jpg)
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. =]
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 11:42:08
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/02/2007 12:28:27
|
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/
|
|
|
 |
|
|