Cualquier desventaja para el uso de objetos arbitrarios como Mapa de teclas en Java?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Tengo dos tipos de objetos que en mi aplicación donde cada objeto de una clase tiene exactamente un objeto correspondiente de la otra clase.

La opción obvia para seguir la pista de esta relación es un Map<type1, type2>, como un HashMap.Pero de alguna manera, soy sospechoso.¿Puedo usar un objeto como una clave en el Mapa, que pasan a su alrededor, se han sentado en otra colección, demasiado, y recuperar su socio del Mapa en cualquier momento?

Después de que un objeto es creado, todo lo que estoy pasando alrededor es un identificador, ¿verdad?Así que, probablemente, no hay ningún problema.Lo que si me serializar y deserializar la clave?

Cualquier otro advertencias?Debo usar algo más para correlacionar el objeto de pares, como puedo generar yo mismo?

¿Fue útil?

Solución

  1. Las necesidades clave para implementar .equals() y .hashCode() correctamente
  2. La clave no debe ser cambiado en cualquier forma que cambia es .hashCode() valor mientras se utiliza como clave de la
  3. Idealmente, cualquier objeto que se utiliza como una clave en un HashMap deben ser inmutables.Esto automáticamente asegurarse de que 2.es siempre cierto.
  4. Los objetos que de otra manera podría ser GCed puede ser mantenido en torno a cuando se utilizan como clave y/o valor.

Otros consejos

  

Tengo dos tipos de objetos en mi   aplicación donde cada objeto de uno   tipo tiene exactamente un correspondiente   objeto del otro tipo.

Esto realmente suena como una relación has-a y, por lo tanto, podría implementarse utilizando un atributo simple.

Depende de la implementación del mapa que elija:

  • HashMap usa equals () y hashCode () . Por defecto (en Objeto) estos se basan en la identidad del objeto, que funcionará bien a menos que serialice / deserialice. Con una implementación adecuada de equals () y hashCode () en función del contenido del objeto, no tendrá problemas, siempre que no lo modifique mientras sea una clave en un mapa hash.

  • TreeMap usa compareTo () . No hay una implementación predeterminada, por lo que debe proporcionar una. Se aplican las mismas limitaciones que para implementar hashCode () y equals () arriba.

Puede usar un mapa estándar, pero al hacerlo, mantendrá fuertes referencias a sus objetos en el mapa. Si sus objetos están referenciados en otra estructura y necesita el Mapa solo para vincularlos, considere usar un WeakHashMap.

Y, por cierto, no tiene que anular equals y hashCode a menos que tenga que considerar varias instancias de un objeto como iguales ...

  

¿Puedo usar un objeto como clave en el Mapa, pasarlo, tenerlo en otra colección también y recuperar a su compañero del Mapa en cualquier momento?

Sí, no hay ningún problema aquí en absoluto.

  

Después de crear un objeto, todo lo que paso es un identificador, ¿verdad? Probablemente no haya problema allí. ¿Qué sucede si serializo y deserializo la clave?

Así es, solo está pasando una referencia: todos apuntarán al mismo objeto real. Si serializa o deserializa el objeto, eso crearía un nuevo objeto. Sin embargo, si su objeto implementa equals y hashCode correctamente, aún debería poder usar el nuevo objeto deserializado para recuperar elementos del mapa.

  

¿Alguna otra advertencia? ¿Debo usar algo más para correlacionar los pares de objetos, como un número que yo mismo genero?

En cuanto a las advertencias, sí, no puede cambiar nada que pueda hacer que el código hash del objeto cambie mientras el objeto está en el mapa.

Cualquier objeto puede ser una clave de mapa. Lo importante aquí es asegurarse de anular .equals () y .hashCode () para cualquier objeto que se utilizará como teclas de mapa.

La razón por la que haces esto es que si no lo haces, igual se entenderá como igualdad de objeto, y la única forma en que podrás encontrar & "; igual &"; map keys es tener un identificador para el objeto original en sí.

Anula el código hash porque debe ser coherente con iguales. Esto es para que los objetos que ha definido como iguales sean idénticamente hash.

Los puntos de falla son las funciones hashcode y equals. Si no producen valores de retorno consistentes y adecuados, el Mapa se comportará de manera extraña. Java eficaz tiene una sección completa sobre ellos y es muy, muy recomendable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top