Duvida com hashCode  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
renato_ramos
JavaGuru
[Avatar]

Membro desde: 07/10/2009 12:04:32
Mensagens: 234
Offline

Oi!

eu estava fazendo uns exercicios da faculdade pediram para eu gerar o hash da minha classe, como eu não entendi muito bem
eu pedi para o netbeans gerar para mim.

Até td bem ele gerous mas não funcionou.



essa eh minha classe abaixo como eu testei.


alguem me explica pq não funcionou.
muito obrigado =D

[]'s Renato Ramos
[Email] [MSN]
ViniGodoy
Moderador
[Avatar]

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

http://www.guj.com.br/posts/list/52485.java#276120

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Marcos Lima
JavaBaby

Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline

O que não funcionou, qual foi o erro?

O código do hashCode() parece bom, está levando em consideração o nome, turno, semestre e matrícula (Se bem que acho que se levasse só a matrícula em consideração seria melhor...)

Marcos Lima
SCJP 6.0 (05/2010)
[MSN]
ViniGodoy
Moderador
[Avatar]

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

Também é necessário implementar o método equals. Você sempre deve sobrescrever o par, equals e hashcode, para que as collections funcionem de maneira consistente.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Marcos Lima
JavaBaby

Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline

Exatamente, se vc não implementar o equals não vai funcionar.

Tente assim:



E quanto ao hashCode, vc poderia levar em consideração só a matrícula (Não existem dois alunos com a mesma matrícula), então eu faria assim:



Bem mais simples, funcional e de fácil manutenção

This message was edited 2 times. Last update was at 12/02/2010 09:47:48


Marcos Lima
SCJP 6.0 (05/2010)
[MSN]
ViniGodoy
Moderador
[Avatar]

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



If com return true ou return false? Lembre-se o if avalia uma expressão booleana. Então, isso é o mesmo que:


Outra coisa, o método equals aceita um Object como parâmetro, não um Aluno. Se fizer com aluno, você estará fazendo a sobrescrita do método, não dará erro e não funcionará.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
fitoplancton
Thread.start()
[Avatar]

Membro desde: 22/06/2004 14:29:54
Mensagens: 26
Offline

Marcos Lima wrote:Exatamente, se vc não implementar o equals não vai funcionar.

Tente assim:



E quanto ao hashCode, vc poderia levar em consideração só a matrícula (Não existem dois alunos com a mesma matrícula), então eu faria assim:



Bem mais simples, funcional e de fácil manutenção


Você não pode estar falando sério...

O fitoplâncton é a base dos ecossistemas aquáticos, pois é por meio da fotossíntese realizada pelas microalgas que a energia entra na cadeia alimentar. As microalgas fitoplanctônicas são em sua grande maioria autotróficas, unicelulares solitárias ou coloniais.

O fitoplâncton pode ser estudado sob o ponto de vista qualitativo, onde os aspectos taxonômicos e de estrutura populacional são enfocados. Os estudos quantitativos do fitoplâncton abordam os padrões de distribuição espacial e temporal e podem ser uma importante ferramenta na avaliação da qualidade de água dos recursos hídricos. As principais divisões do fitoplâncton em águas continentais são: Cyanophyta, Chlorophyta, Euglenophyta, Crysophyta e Pyrrophyta.
Marcos Lima
JavaBaby

Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline

Nossa, fui noob com esse if, haha

E quanto ao equals... Certo, é Object e também esqueci desses ifzinhos testando se é null, e tal...

Dá um desconto, hoje é sexta

Marcos Lima
SCJP 6.0 (05/2010)
[MSN]
Marcos Lima
JavaBaby

Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline

fitoplancton, no hashCode eu falei sério... Se vc levar em conta todos os campos, vc pode acabar com 2 Alunos com mesma matrícula em cursos diferentes, o que com certeza é um problema. Mas isso se aplicaria ao método equals também. Lembrando que aí é questão de negócio e estrutura do software, e não de desempenho.

Marcos Lima
SCJP 6.0 (05/2010)
[MSN]
renato_ramos
JavaGuru
[Avatar]

Membro desde: 07/10/2009 12:04:32
Mensagens: 234
Offline

Opa, desde ja agradeco a atenção

eu tentei

getMatricula().hashCode(); e não afuncionou!

entao eu deixei somente getMatricula();

funcionou!

mas isso foi somente exemplo e tals.. e gostaria de saber por que com as string como parametro do hash não funcionou já que eu coloquei tudo igual.

qnto ao equals(Aluno a); eu implementei mas o netbeans fala para ter um equals(Object obj);

deixei o do Object obj;


obrigado!

[]'s Renato Ramos
[Email] [MSN]
Marcos Lima
JavaBaby

Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline

Pelo jeito vc está usando Java 1.4...

Para isso, tente



Usar a própria matrícula como hashCode é uma saída, mas se vc tem muitos Alunos para cadastrar pode haver muita colisão no seu HashSet.

Não funcionou antes porquê:
O hashCode que estava sendo chamado era herdado da classe Object. Se vc observar, ele é nativo e não leva os atributos do objeto herdado em questão (Até pq não teria como, ele não os conhece). Mesmo que todos os atributos sejam iguais, ele não vai retornar o mesmo hashCode, você sempre deve sobrescrevê-lo quando usar como índice para qualquer tabela Hash.

Use o equals sugerido pelo ViniGodoy, eu não estava pensando bem quando falei para usar Aluno como parâmetro
Espero que eu tenha sido claro.

This message was edited 3 times. Last update was at 12/02/2010 10:30:13


Marcos Lima
SCJP 6.0 (05/2010)
[MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

renato_ramos wrote:

essa eh minha classe abaixo como eu testei.


alguem me explica pq não funcionou.
muito obrigado =D


Se vc explicar o que significa "não funcionar" ...

O problema não é o seu hash é o seu conceito.

O hash está ok mas vc está colocando dois objetos iguais num Set. O set vai guardar o primeiro.
Quando tentar por o segundo ele vai encontrar um com o mesmo hash. (acontece uma colisão de hash)
Então ele vai usar o equals() para saber se o objeto é o mesmo. ah!, mas vc não implemento o equals, logo o equals padrão vai ser usado.
Este vai dizer que os objetos são diferentes ( pois ele apenas faz == entre eles). E portanto o Set aceita o segundo objeto.

O set tem razão. A sua classe é que está errada

implemente o equals em conformidade com o hashSet.

Agora, o hash não precisa ter todos os campos da classe. Isso representa que vc não sabe o que é e para que serve o hash.

A regra é assim :
1) se x.equals(y) => x.hashCode() == y.hashCode()
2) Se reimplementar equals ou hashCode tem que reimplementar o outro também.

Atendamos a (1) apenas, pois já vimos que o seu problema é não ter respeitado (2)
Vamos pensar que para que os objetos sejam iguais os campos A e B tem que ser iguais em ambos os objetos

Portanto, se A E B têm que ser iguais é verdade que A tem que ser igual, logo se usar o hashcode como A.hashCode vc está garantindo (1) e o hash estará bem implementado.

Alguem ai sugeriu usar apenas matricula.hashCode, isso está correto sim.

Mas porque escolher A em vez de B para ser usado no hash? Vc deve escolher aquele que tiver probabilidade maior de ser diferente. A matricula é o que tem maior probabilidade porque: ha muitos alunos num turno e semestre e é possivel ter pessoas com o mesmo nome.
Na construção do equals o campo que tiver mais probabilidade de ser diferente tb deve vir primeiro.


Já agora , nunca , nunca, nunca, (...) , nunca , nunca façam um if/else que retorna boleano

Isto


Se substitui por :


This message was edited 1 time. Last update was at 12/02/2010 10:42:54


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
ViniGodoy
Moderador
[Avatar]

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

O hashCode do Integer é o próprio int que ele contém. Então:
new Integer(getMatricula()).hashCode() é equivalente a só getMatricula().


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Marcos Lima
JavaBaby

Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline

Puts, ViniGodoy, vc está me destruindo...
Acho que vou ler um livro, hahaha...

Marcos Lima
SCJP 6.0 (05/2010)
[MSN]
Felagund
GUJ Master
[Avatar]

Membro desde: 26/07/2006 11:51:36
Mensagens: 1732
Localização: Santa e Bela Catarina
Offline

sergiotaborda wrote:
Já agora , nunca , nunca, nunca, (...) , nunca , nunca façam um if/else que retorna boleano

Isto


Se substitui por :




Vejo algum null pointer a caminho em qualquer uma dessa condições

att
Rafael Felix

Rolling With Code
Twitter
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team