Las entrevistas de Java backend cubren la semántica central del lenguaje, colecciones, concurrencia, Spring, y cómo razonas sobre la JVM. Aquí están las preguntas más frecuentes, cada una con una respuesta modelo. Junior: teoría básica, definiciones y casos prácticos simples.
1
¿Cuál es la diferencia entre == y equals() para objetos?
Respuesta
== compara referencias — si dos variables apuntan al mismo objeto en memoria. equals() compara contenido, si la clase lo sobreescribe; el Object.equals por defecto recae en ==. Por eso comparar dos Strings construidos en runtime con == devuelve false mientras equals() devuelve true, y es el tropiezo más común en entrevistas de Java.
2
¿Cuál es la diferencia entre una interface y una clase abstracta?
Respuesta
Una clase abstracta puede tener estado y constructores y describe qué es algo; una clase puede extender solo una. Una interface describe qué puede hacer algo y una clase puede implementar muchas. Desde Java 8 las interfaces pueden llevar métodos default, así que la regla práctica es: estado compartido significa clase abstracta, capacidad compartida significa interface.
3
¿Qué es el autoboxing y dónde muerde?
Respuesta
Autoboxing es el compilador convirtiendo automáticamente entre primitivos y sus wrappers. Muerde en dos lugares: comparar wrappers con == funciona por accidente para valores pequeños por la caché de Integer entre -128 y 127 y luego deja de funcionar silenciosamente, y hacer unboxing de un Integer null lanza NullPointerException en una línea que parece aritmética normal.
4
Explica final, finally y finalize.
Respuesta
No están relacionados a pesar de los nombres. final hace una variable no reasignable, un método no sobreescribible, o una clase no extensible. finally es el bloque que corre haya o no una excepción lanzada, usado para limpieza. finalize era un método que el garbage collector podía llamar antes de recuperar un objeto; era poco confiable y está deprecado — usa try-with-resources en su lugar.
5
¿Cuál es la diferencia entre ArrayList y LinkedList?
Respuesta
ArrayList envuelve un array redimensionable: el acceso por índice es O(1), pero insertar en el medio desplaza todo lo que sigue. LinkedList es una lista doblemente enlazada: insertar en un nodo conocido es O(1), pero llegar al índice n cuesta n pasos y cada elemento carga overhead de puntero. En la práctica ArrayList gana casi siempre, porque la localidad de caché vence al big-O en hardware real.
6
¿Qué significa realmente la palabra clave static?
Respuesta
Un miembro static pertenece a la clase y no a ninguna instancia, así que existe una sola vez sin importar cuántos objetos crees y se puede usar sin uno. La consecuencia que la gente olvida es que un campo static es estado mutable compartido en toda la aplicación — conveniente para constantes, fuente de bugs difíciles para cualquier cosa que cambie.
7
¿Cuál es la diferencia entre excepciones checked y unchecked?
Respuesta
Las excepciones checked extienden Exception y el compilador te obliga a capturarlas o declararlas; describen condiciones de las que un caller puede razonablemente recuperarse, como un archivo faltante. Las unchecked extienden RuntimeException y señalan errores de programación — una referencia null, un argumento incorrecto. Usa unchecked para bugs, y checked con moderación, porque forzar a cada caller a manejar algo usualmente produce bloques catch vacíos.
8
¿Cuál es el contrato entre `equals()` y `hashCode()`?
Respuesta
Si dos objetos son iguales deben devolver el mismo hash code; lo inverso no es requerido. Rómpelo y un HashMap deja de funcionar — pones un objeto, lo buscas con uno igual, y obtienes null, porque la búsqueda fue a otro bucket. Por eso sobreescribir uno sin el otro es un bug, no una cuestión de estilo.
9
¿Por qué `String` es inmutable en Java?
Respuesta
Porque se comparte. Los literales viven en el string pool y una instancia puede ser referenciada desde muchos lugares, así que un string mutable dejaría que un poseedor cambiara el valor de otro. La inmutabilidad también hace a los strings thread-safe sin sincronización, permite cachear el hash code, y los mantiene seguros para usar en class loading y parámetros de conexión donde un cambio tardío sería un agujero de seguridad.
10
¿Puedes sobreescribir un método static?
Respuesta
No — solo puedes ocultarlo. El overriding se resuelve en runtime desde el tipo del objeto, mientras que un método static se resuelve en tiempo de compilación desde el tipo de la referencia. Así que una subclase que declara la misma firma static no reemplaza a la del padre; cuál corre depende del tipo declarado, no del objeto real, que es exactamente por qué llamar a un static a través de una referencia de instancia se desaconseja.