recorrer mapas funciona entre diferencia dentro como java hashmap

java - funciona - ¿Por qué es útil tener valores nulos o claves nulas en los mapas hash?



recorrer list map java (6)

1. ¿Por qué es así?

HashMap es más nuevo que Hashtable y corrige algunas de sus limitaciones.

Solo puedo adivinar lo que pensaban los diseñadores, pero aquí están mis conjeturas:

  • Hashtable calcula un hash para cada clave llamando a hashCode en cada clave. Esto fallaría si la clave fuera nula, por lo que podría ser una razón para deshabilitar nulos como claves.
  • El método Hashtable.get devuelve nulo si la clave no está presente. Si nulo fuera un valor válido, sería ambiguo si nulo significaba que la clave estaba presente pero tenía un valor nulo, o si la clave estaba ausente. La ambigüedad es mala, por lo que esta podría ser una razón para no permitir valores nulos como valores.

Sin embargo, resulta que a veces realmente quieres almacenar nulos, por lo que las restricciones se eliminaron en HashMap. La siguiente advertencia también se incluyó en la documentación de HashMap.get :

Un valor de retorno de nulo no indica necesariamente que el mapa no contenga ninguna asignación para la clave; También es posible que el mapa asigne explícitamente la clave a nulo.

2. ¿Qué utilidad tiene tener una clave y valores de este tipo en HashMap?

Es útil almacenar explícitamente nulo para distinguir entre una clave que sabe que existe pero que no tiene un valor asociado y una clave que no existe. Un ejemplo es una lista de usuarios registrados y sus cumpleaños. Si solicita el cumpleaños de un usuario específico, desea poder distinguir entre el usuario que no existe y el usuario existente pero que no ha ingresado su cumpleaños.

No puedo pensar en ninguna (buena) razón para querer almacenar nulos como una clave, y en general, no recomendaría el uso de nulos como una clave, pero presumiblemente hay al menos una persona en algún lugar que necesita esas claves que pueden ser nulo.

Hashtable no permite claves o valores nulos, mientras que HashMap permite valores nulos y 1 clave nula.

Preguntas:

  1. ¿Por qué esto es tan?
  2. ¿Qué tan útil es tener una clave y valores de este tipo en HashMap?

Además de lo que Mark Bayers respondió, Null se considera como datos y debe almacenarse como un valor para una verificación posterior. En muchos casos, el valor nulo se puede usar para verificar si hay una entrada clave pero no se le asigna ningún valor, por lo que se puede tomar alguna acción en consecuencia. Esto se puede hacer primero verificando si la clave está ahí y luego obteniendo valor. Hay un caso más en el que solo se ponen los datos que vienen (sin ninguna verificación). Todos los controles se le aplican después de obtenerlo.

Mientras que nulo como clave, creo que se puede usar para definir algunos datos predeterminados. Por lo general nula como clave no tiene mucho sentido.


Bueno, creo que Mark Byers respondió perfectamente, así que solo un ejemplo simple donde los valores y claves nulos pueden ser útiles:

Imagina que tienes una función costosa que siempre devuelve el mismo resultado para la misma entrada. Un mapa es una forma sencilla de almacenar en caché sus resultados. Tal vez a veces la función devolverá el valor nulo, pero debe guardarla de todos modos, porque la ejecución es costosa. Por lo tanto, los valores nulos deben ser almacenados. Lo mismo se aplica a la clave nula si es una entrada aceptada para la función.


Hará que la interfaz del mapa sea más fácil de usar / menos detallada. null es un valor legítimo para los tipos de referencia. Hacer que el mapa sea capaz de manejar claves y valores nulos eliminará la necesidad de verificar nulos antes de llamar a la API. Así que el mapa de API crea menos "sorpresas" durante el tiempo de ejecución.

Por ejemplo, es común que el mapa se use para categorizar una colección de objetos homogéneos basados ​​en un solo campo. Cuando el mapa es compatible con null, el código será más conciso, ya que es solo un bucle simple sin ninguna instrucción if (por supuesto, deberá asegurarse de que la colección no tenga elementos nulos). Una menor cantidad de líneas de código sin manejo de sucursales / excepciones será más probable que sea lógicamente correcta.

Por otro lado, no permitir null no hará que la interfaz del mapa sea mejor / más segura / más fácil de usar. No es práctico confiar en el mapa para rechazar valores nulos, lo que significa que se lanzará una excepción y usted tendrá que capturarla y manejarla. O, para deshacerse de la excepción, tendrá que asegurarse de que nada sea nulo antes de llamar a los métodos del mapa, en cuyo caso no le importa si el mapa acepta el nulo ya que de todos modos filtró la entrada.


HashTable es una clase muy antigua, desde JDK 1.0. Las clases que están implementadas desde JDK 1.0 se denominan clases heredadas y, de forma predeterminada, están sincronizadas .

Para comprender esto, primero debe comprender los comentarios escritos por el autor en esta clase. “Esta clase implementa una tabla hash, que asigna claves a valores. Cualquier objeto que no sea nulo puede usarse como una clave o como un valor. "Para almacenar y recuperar con éxito objetos de una tabla hash, los objetos utilizados como claves deben implementar el método hashCode y el método equals".

La clase HashTable se implementa en el mecanismo de hash, significa almacenar cualquier par clave-valor, su código hash requerido del objeto clave. HashTable calcula un hash para cada clave llamando a hashCode en cada clave. Esto fallaría. Si la clave fuera nula, no sería capaz de dar un hash para la clave nula, arrojaría NullPointerException y similar es el caso para el valor, lanzando nulo si el valor es nulo .

Pero más tarde se dio cuenta de que la clave nula y el valor tienen su propia importancia, luego se introdujeron implementaciones revisadas de HashTable como HashMap, que permite una clave nula y varios valores nulos.

Para HashMap, permite una clave nula y hay una comprobación nula para las claves. Si la clave es nula, ese elemento se almacenará en una ubicación cero en la matriz de entrada.

No podemos tener más de una clave nula en HashMap porque las claves son únicas, ya que solo se permite una clave nula y se permiten muchos valores nulos.

USE - Clave nula que podemos usar para algún valor predeterminado.

La implementación mejorada y modificada de HashTable se introdujo más tarde como ConcurrentHashMap .


Sir HashMap también utiliza internamente el método hashCode () para insertar un elemento en HashMap, por lo que creo que esta no será la razón adecuada para "por qué HashTable permite la clave nula"