Qualquer desvantagem para o uso arbitrário de objetos como chaves de Mapa em Java?

StackOverflow https://stackoverflow.com/questions/635014

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu tenho dois tipos de objetos em minha aplicação, onde cada objeto de um tipo que tem exatamente um objeto correspondente do outro tipo.

A escolha óbvia para acompanhar essa relação é Map<type1, type2>, como um HashMap.Mas, de alguma forma, eu sou suspeito.Posso usar um objeto como uma chave no Mapa, passe-a em redor, tê-lo sentado na outra coleção, também, e recuperar o seu parceiro a partir do Mapa a qualquer momento?

Depois que um objeto é criado, tudo o que eu estou passando em torno de um identificador, certo?Então, provavelmente, não há problema.E se eu serializar e desserializar a chave?

Quaisquer outros avisos?Devo usar alguma coisa para correlacionar o objeto de pares, como um número que eu gerar mim?

Foi útil?

Solução

  1. As principais necessidades para implementar .equals() e .hashCode() corretamente
  2. A chave não deve ser alterados em qualquer forma que muda é .hashCode() valor enquanto é usado como a chave
  3. Idealmente, qualquer objeto usado como uma chave em um HashMap deve ser imutável.Isso seria automaticamente assegurar que 2.é sempre verdadeira.
  4. Objetos que, de outra forma, poderiam ser GCed pode ser mantida em torno de quando eles são usados como chave e/ou valor.

Outras dicas

Eu tenho dois tipos de objetos no meu aplicativo, onde todo objeto de um tipo tem exatamente um objeto correspondente do outro tipo.

Isso realmente soa como um relacionamento HAS-A e, portanto, pode ser implementado usando um atributo simples.

Depende da implementação do mapa que você escolher:

  • Hashmap usos é igual a() e HashCode (). Por padrão (em objeto), eles são baseados na identidade do objeto, que funcionará bem, a menos que você serialize/desserialize. Com uma implementação adequada de iguais () e hashcode () com base no conteúdo do objeto, você não terá problemas, desde que não o modifique enquanto for uma chave em um mapa de hash.

  • Treemap usos comparado a(). Não há implementação padrão, então você precisa fornecer um. As mesmas limitações se aplicam à implementação do hashCode () e igual () acima.

Você pode usar um mapa padrão, mas isso manterá referências fortes aos seus objetos no mapa. Se seus objetos forem referenciados em outra estrutura e você precisará do mapa apenas para vinculá -los, considere o uso de um hashmap fraco.

E btw você não precisa substituir iguais e hashcode, a menos que precise considerar várias instâncias de um objeto como igual ...

Posso usar um objeto como uma chave no mapa, passá -lo, ter -o em outra coleção também e recuperar seu parceiro do mapa a qualquer momento?

Sim, não há problema aqui.

Depois que um objeto é criado, tudo o que estou passando é um identificador, certo? Então provavelmente não há problema lá. E se eu serializar e desseriizar a chave?

É isso mesmo, você está passando apenas uma referência - todos apontarão para o mesmo objeto real. Se você serializar ou desserializar o objeto, isso criaria um novo objeto. No entanto, se o seu objeto implementarem e hashcode corretamente, você ainda poderá usar o novo objeto desserializado para recuperar itens do mapa.

Alguma outra advertência? Devo usar outra coisa para correlacionar os pares de objetos, como um número que eu me gero?

Quanto às advertências, sim, você não pode alterar nada que faça com que o código de hash do objeto mude enquanto o objeto está no mapa.

Qualquer objeto pode ser um mapa chave.O importante aqui é ter certeza de que você substituir .equals() e .hashCode() para os objetos que serão usados como chaves de mapa.

A razão de você fazer isso é que se você não o fizer, é igual a ser compreendido como objeto de igualdade, e a única maneira que você vai ser capaz de encontrar "igual" mapa de teclas é ter um identificador para o objeto original em si.

Você sobrescrever hashcode porque ele precisa ser consistente com os iguais.Este é o modo que os objetos que você tenha definido como igual a hash de forma idêntica.

The failure points are the hashcode and equals functions. If they don't produce consistent and proper return values, the Map will behave strangely. Effective Java has a whole section on them and is highly, highly recommended.

You might consider Google Collection's BiMap.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top