Pregunta de entrevista para Desarrollador Java

Explica cómo funciona HashMap por dentro, incluido qué pasa a medida que se llena.

Qué evalúa el entrevistador, cómo estructurar tu respuesta y un ejemplo hablado que puedes adaptar.

Respuesta rápida

Un HashMap tiene un array de buckets. El hash de la clave se dispersa mezclando sus bits altos, y luego el índice es ese hash enmascarado contra el tamaño de la tabla, que siempre es potencia de dos. Las colisiones forman una lista enlazada en el bucket, y un bin con al menos ocho entradas en una tabla de al menos sesenta y cuatro se convierte en un árbol rojo negro. Pasado el factor de carga de 0,75 la tabla se duplica y las entradas se rehashean.

Por qué lo preguntan los entrevistadores

El entrevistador comprueba si entiendes la estructura de datos que usas en cada clase, en vez de recitar que es rápida. Los detalles de treeification y redimensionado muestran conocimiento actual, porque la implementación cambió en Java 8. Además lleva de forma natural a por qué las claves deberían ser inmutables, por qué un hash pobre degrada el rendimiento y por qué HashMap no es seguro con escrituras concurrentes.

Cómo estructurar tu respuesta

  • Describe el array de buckets y cómo se deriva un índice.
  • Explica el manejo de colisiones y el paso de lista a árbol.
  • Cubre el factor de carga, el redimensionado y el coste del rehash.
  • Saca las conclusiones prácticas sobre el diseño de claves y la seguridad entre hilos.

Ejemplo de respuesta

Ejemplo hablado, en primera persona

Por dentro es un array de bins. El hashCode de la clave se dispersa haciendo un or exclusivo de los bits altos hacia abajo, lo que importa porque el índice es simplemente el hash enmascarado con el tamaño de tabla menos uno, así que sin esa mezcla solo se usarían los bits bajos. Las entradas que colisionan se encadenan en ese bin, y desde Java 8 un bin que pasa de ocho entradas, cuando la tabla tiene al menos sesenta y cuatro, se convierte en un árbol rojo negro, así que la búsqueda en el peor caso es logarítmica en vez de lineal. Eso fue una respuesta a los ataques de denegación de servicio por colisiones de hash. El crecimiento lo manda el factor de carga, así que al 0,75 de ocupación la tabla se duplica y todo se redistribuye, y por eso dimensionar el mapa por adelantado importa si sé que va a tener un millón de entradas. Las consecuencias prácticas que me importan son que las claves deberían ser inmutables, que un hashCode malo hace que todo caiga en un solo bin, y que las escrituras concurrentes pueden corromper la tabla, así que los mapas compartidos llevan ConcurrentHashMap en vez de bloqueo externo.

¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.

Mira cómo funciona

Preguntas de seguimiento que puedes esperar

  • ¿Por qué el tamaño de la tabla es siempre potencia de dos?
  • ¿Qué hace distinto ConcurrentHashMap para permitir escrituras concurrentes?
  • ¿Cuándo preferirías LinkedHashMap o TreeMap?

Más preguntas para Desarrollador Java

Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.

Predecir mis preguntas

Ensaya las preguntas difíciles antes de que te las hagan

Practica con un copiloto en vivo y entra preparado. Un Session Pass de $29 te lleva a través de la entrevista sin suscripción y sin ataduras.

Consigue GhostPilot