Cómo aprobar una entrevista de Java: preguntas y respuestas avanzadas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo aprobar una entrevista de Java: principales preguntas de nivel avanzado

\n\n

La entrevista para un puesto de Senior Java Developer no es solo una verificación de sintaxis. Los entrevistadores quieren asegurarse de que entiendes cómo funciona la JVM internamente, sabes diseñar sistemas concurrentes y conoces los detalles de la recolección de basura. En este artículo analizaremos las preguntas más frecuentes y difíciles que te ayudarán a superar con confianza la entrevista técnica.

\n\n

1. Concurrencia y modelo de memoria de Java (JMM)

\n

Este es uno de los temas más extensos. Los entrevistadores verifican si entiendes cómo los hilos interactúan a través de la memoria compartida y qué problemas pueden surgir.

\n\n

Pregunta: ¿Cuál es la diferencia entre volatile y synchronized?

\n

Respuesta: volatile garantiza la visibilidad de los cambios para todos los hilos, pero no proporciona atomicidad. synchronized garantiza tanto visibilidad como atomicidad (bloquea el monitor).

\n
// Ejemplo de uso de volatile\npublic class VolatileExample {\n    private volatile boolean running = true;\n\n    public void stop() {\n        running = false; // El cambio es visible inmediatamente para otros hilos\n    }\n\n    public void run() {\n        while (running) {\n            // ejecución del trabajo\n        }\n    }\n}
\n\n

Pregunta: ¿Qué es happens-before en JMM?

\n

Respuesta: Es una relación de orden parcial que garantiza que las acciones en un hilo sean visibles para otro. Por ejemplo, la escritura en una variable volatile crea un happens-before con la posterior lectura de esa variable por otro hilo. También se produce happens-before al entrar/salir de un bloque synchronized.

\n\n

Pregunta: ¿Cómo está estructurado ConcurrentHashMap?

\n

Respuesta: En Java 8+, ConcurrentHashMap utiliza segmentación a nivel de cubetas (buckets). En lugar de bloquear toda la tabla, solo se bloquea el cubo específico (en caso de colisiones). Para operaciones de lectura no se usan bloqueos, se utiliza lectura volatile. Con alta contención, las estructuras internas pueden reconfigurarse (por ejemplo, árbol en lugar de lista).

\n
// Ejemplo de ConcurrentHashMap\nConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();\nmap.put("key", 1);\nInteger value = map.get("key"); // Sin bloqueo de lectura
\n\n

2. Recolección de basura y optimización de GC

\n

Las preguntas sobre el Garbage Collector (GC) son obligatorias para posiciones Senior. Necesitas conocer no solo los tipos de GC, sino también cómo configurarlos según la carga.

\n\n

Pregunta: ¿Cuáles son los principales tipos de GC en HotSpot JVM?

\n

Respuesta: Los recolectores principales son:

\n
    \n
  • Serial GC — de un solo hilo, para aplicaciones cliente.
  • \n
  • Parallel GC (Throughput) — multihilo, orientado al rendimiento.
  • \n
  • G1 GC (Garbage First) — predeterminado desde Java 9, divide el heap en regiones, minimiza las pausas.
  • \n
  • ZGC y Shenandoah — recolectores de baja latencia con pausas de menos de 10 ms.
  • \n
\n\n

Pregunta: ¿Qué es una pausa Stop-The-World?

\n

Respuesta: Es el momento en que todos los hilos de la aplicación se detienen para que el GC pueda realizar su trabajo. Las pausas STW prolongadas son críticas para sistemas en tiempo real. G1 GC intenta minimizarlas realizando la recolección en paralelo e incrementalmente.

\n\n

Pregunta: ¿Cómo identificar una fuga de memoria en Java?

\n

Respuesta: Usa perfiladores (VisualVM, JProfiler). Monitorea el crecimiento del heap dump. Las causas típicas de fugas incluyen: colecciones estáticas no liberadas, implementación incorrecta de equals/hashCode en HashMap, listeners que no se desregistran.

\n
// Ejemplo de fuga: colección estática\npublic class LeakExample {\n    private static List<byte[]> cache = new ArrayList<>();\n\n    public void addData() {\n        cache.add(new                

Blogs

Book Recommendations