Debe esforzarse por utilizar tipos inmutables como claves para Map
s. Las colecciones y los conjuntos generalmente son muy fáciles de cambiar, por lo que, por lo general, es una mala idea usarlos de esta manera.
Si desea utilizar muchos valores clave como una clave Map
, debe utilizar una implementación de clase diseñada para tal fin, como Apache Commons Collections MultiKey
.
Si realmente debe utilizar un Conjunto o Colección como clave, primero hágalo inmutable (Collections.unmodifiableSet(...)
) y luego no mantenga una referencia al objeto de respaldo mutable.
Otra dificultad con el uso de Colecciones como claves es que se pueden construir en un orden diferente. Solo una colección ordenada tendrá una probabilidad alta de emparejamiento. Por ejemplo, si usa una orden ordenada secuencialmente ArrayList
pero construye la lista de una manera diferente la segunda vez no coincidirá con la clave; el código hash y el orden de los valores es diferente.
EDIT: Estoy corregido en esta declaración a continuación, nunca he tenido que usar Establecer para un ket. Acabo de leer una parte de la implementación de hashCode en AbstractHashSet. Esto usa un total simple de todos los valores, por lo que no depende del orden. Igual también comprueba que un conjunto contiene todos los valores en el otro conjunto. Sin embargo, esto sigue siendo cierto con otros tipos de colecciones en Java (el orden de ArrayList sí importa).
Si su colección es realmente HashSet
, la orden de creación también puede ser importante. De hecho, una colección gestionada por hash de cualquier tipo será aún más problemática ya que cualquier cambio en la capacidad desencadenará una reconstrucción de toda la colección que puede reordenar los elementos. Piense en colisiones de hashes que se almacenan en el orden en que ocurre la colisión (una cadena simple enlazada de todos los elementos donde el valor hash transformado es el mismo).
Tiene toda la razón sobre el tema _unspecified_. Supongo que tendré que implementar algún tipo de estructura de búsqueda similar a un árbol, donde los nodos tienen valores tanto como los hijos. –