50 Preguntas que debes responder antes de una entrevista de Java (Actualizado 2025) - Parte 2

Photo by Wes Hicks on Unsplash


¿Estás buscando trabajo como desarrollador Java? Pues has venido al lugar correcto.

En este artículo te presentamos una serie de preguntas que te servirán para responder correctamente en la entrevista de Java. El artículo cuenta con las preguntas 26 a la 50. Las preguntas 1 - 25 las encuentras en la primera parte del artículo "50 Preguntas que debes responder antes de una entrevista de Java (Actualizado 2025)". No olvides leerlo también, antes de tu entrevista de Java.

Comencemos.

 

26.      ¿Qué es el método hashCode()? ¿Para qué se utiliza?

El método hashCode() en una cadena realiza un cálculo complejo del tipo

s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]

Utilizando aritmética de enteros, donde s[i] es el i-ésimo carácter de la cadena, n es la longitud de la cadena, y ^ indica exponenciación. (El valor hash de la cadena vacía es cero).

En un objeto, el método hashCode() devuelve la dirección de memoria del objeto en hexadecimal. Por definición, si dos objetos son iguales, sus códigos hash también deben ser iguales.​

Fuente: Oracle

El hashCode() se utiliza para la asignación en estructuras como HashMap. Los HashMap suelen dividirse en "buckets" y cada uno puede contener varios pares clave/valor. El hashCode() del objeto determina en qué "bucket" se coloca, mediante la expresión: object.hashCode() % n, donde n es el número total de "buckets" y % es el operador módulo.​

Generalmente, los objetos se distribuyen bien entre los "buckets", pero no hay garantía de dónde irán; esto depende de los datos y de la función hashCode().​

Fuente: Stackoverflow

Al realizar una consulta contains(), el HashMap tomará el hashCode() del elemento y buscará el "bucket" correspondiente. Si hay más de un elemento en el "bucket", el HashMap utilizará el método equals() para evaluar si los objetos son iguales.​

Fuente: Stackoverflow

 

27.      ¿Para qué se usa el método equals()?

El método equals() nos permite evaluar si dos objetos son iguales. Este método tiene cuatro características: reflexiva, simétrica, transitiva y consistente. Para cualquier valor de referencia no nulo x y y, este método devuelve true si y solo si x e y se refieren al mismo objeto (x == y tiene el valor true).​

28.      ¿Cuál es la relación entre equals() y hashCode()?

Siempre que se sobrescribe el método equals(), también es necesario sobrescribir el método hashCode(), para mantener el contrato general del método hashCode(), que establece que objetos iguales deben tener códigos hash iguales.​

 

29.      ¿Cómo podemos comparar dos cadenas en Java?

La comparación de cadenas en Java es un tema especial. En lugar de usar el operador habitual ==, debemos usar el método equals() para verificar si el valor de dos cadenas es el mismo.​

  • == prueba la igualdad de referencia (si son el mismo objeto).​
  • equals() prueba la igualdad de valor (si son lógicamente "iguales").​

Ejemplos:

// Estas dos tienen el mismo valor

new String("prueba").equals("prueba") // --> true

 

// ... pero no son el mismo objeto

new String("prueba") == "prueba" // --> false

 

// ... tampoco lo son estas

new String("prueba") == new String("prueba") // --> false

 

// ... pero estas sí lo son porque los literales se internan

// por el compilador y, por lo tanto, se refieren al mismo objeto

"prueba" == "prueba" // --> true

 

// ... los literales de cadena son concatenados por el compilador y los resultados son internalizados

"prueba" == "prue" + "ba" // --> true

Fuente: Stackoverflow

 

30.      ¿Cuáles son los principales elementos contenidos en la biblioteca de colecciones? ¿Cuál es la diferencia entre los mismos?

Mapas (Maps), Conjuntos (Sets) y Listas (Lists). Los tres son interfaces que pueden implementarse de diferentes maneras a través de varios implementadores también contenidos en la biblioteca.​

  • Lista (List): Representa una secuencia ordenada de objetos. Cada elemento tiene un índice y pueden accederse, iterarse y eliminarse según el orden en que aparecen. Las listas proporcionan una colección ordenada e indexada que puede contener duplicados.​
  • Conjunto (Set): Es una colección desordenada de objetos únicos. Los conjuntos no permiten duplicados. Ciertas implementaciones mantienen el orden.​
  • Mapa (Map): Es una secuencia ordenada de objetos que consiste en pares clave/valor. Puede contener valores duplicados, pero no claves duplicadas.

31.      ¿Cuál es la diferencia entre ArrayList y LinkedList?

Ambos son implementaciones de la interfaz List. La diferencia radica en la estructura que utilizan para almacenar los elementos. ArrayList utiliza, como es de esperar, un array dinámico para almacenar los elementos. LinkedList utiliza una lista doblemente enlazada. ArrayList es más adecuado para almacenar y acceder a datos, mientras que LinkedList es mejor para manipular datos (son más rápidos al eliminar elementos porque no se requiere desplazamiento de bits).​

32.      ¿Cómo se puede detectar un ciclo en una lista enlazada (LinkedList)?

La detección de ciclos en una lista enlazada es un tema común. Para ello, el algoritmo de Floyd, también conocido como el algoritmo de la tortuga y la liebre, ha sido desarrollado.

El algoritmo utiliza dos punteros que se desplazan a través de la lista a velocidades diferentes. El primer puntero se desplaza un elemento a la vez. Éste es conocido como el puntero lento o la tortuga. Por su parte, el segundo puntero se desplaza al doble de la velocidad del primero; es decir, dos elementos a la vez. Al segundo puntero se le conoce como el puntero veloz o la liebre.

Mientras los punteros están atravesando la lista completa, uno de los siguientes eventos ocurrirá:

a)       La liebre (puntero veloz) puede alcanzar el final de la LinkedList. Esto indica que no hay ciclos en la misma.

b)      La liebre “alcanzará” a la tortuga, indicando que existe un ciclo en la lista enlazada.

Fuente: GeeksForGeeks

33.      ¿Un Mapa (Map) es una clase o una interfaz?

Map es una interfaz en Java que representa una asignación entre una clave y un valor. Las implementaciones de Map incluyen:​

  • java.util.HashMap
  • java.util.TreeMap​
  • java.util.LinkedHashMap​
  • java.util.EnumMap​
  • java.util.WeakHashMap​
  • java.util.IdentityHashMap​
  • java.util.Hashtable​
  • java.util.Properties​

34.      ¿Cuál es la diferencia entre un HashMap, Hashtable y ConcurrentHashMap?

HashMap, Hashtable y ConcurrentHashMap son implementaciones de Map con propósitos específicos:

ü  HashMap: No es sincronizado, permite claves y valores nulos.

ü  Hashtable: Es sincronizado, pero menos eficiente en entornos multihilo.

ü  ConcurrentHashMap: Mejora el rendimiento en concurrencia dividiendo el mapa en segmentos.

 

35. ¿Puedes mencionar algunos usos típicos de Listas, Sets y Mapas?

El uso de cada colección depende de lo que intentamos lograr. Por ejemplo, si queremos identificar elementos basándonos en una clave única, utilizaríamos un Map. Si necesitamos una colección ordenada de elementos que permita duplicados, una List sería adecuada. Para una colección de elementos únicos sin un orden específico, un Set sería la elección correcta.

36. ¿Para qué se utiliza la palabra clave transient?

Antes de entender la palabra clave transient, es importante comprender el concepto de serialización. La serialización es el proceso de hacer persistente el estado de un objeto, es decir, convertir el estado del objeto en una secuencia de bytes y almacenarlo en un archivo. De manera similar, la deserialización permite recuperar el estado del objeto a partir de los bytes. La palabra clave transient indica que una variable no forma parte del estado persistente de un objeto, lo que significa que su contenido no debe ser persistido en un archivo y debe derivarse programáticamente de otros campos. Por ejemplo:​

class ImagenGaleria implements Serializable {

    private Image imagen;

    private transient Image imagenMiniatura;

 

    private void generarMiniatura() {

        // Generar miniatura.

    }

 

    private void readObject(ObjectInputStream inputStream)

            throws IOException, ClassNotFoundException {

        inputStream.defaultReadObject();

        generarMiniatura();

    }

}

En este ejemplo, el atributo imagen es serializable, lo que significa que forma parte del estado persistente del objeto. Por otro lado, imagenMiniatura es transient, por lo que no se persistirá, lo que permite ahorrar espacio de almacenamiento. ​

 

37. ¿Qué es una excepción? ¿Cuál es la diferencia entre una excepción y una excepción en tiempo de ejecución (RuntimeException)?

Una excepción es un problema que surge durante la ejecución de un programa. Cuando ocurre una excepción, el flujo normal del programa se interrumpe y la aplicación puede terminar de manera anormal si no se maneja adecuadamente. Existen tres tipos principales de excepciones:

  • Excepciones comprobadas (Checked Exceptions): Son verificadas por el compilador en tiempo de compilación.El programador está obligado a manejar estas excepciones explícitamente. Ejemplos incluyen IOException, SQLException, etc.
  • Excepciones no comprobadas (Unchecked Exceptions): Ocurren en tiempo de ejecución y no son verificadas en tiempo de compilación. Pueden ser generadas por errores lógicos, uso incorrecto de API, entre otros.Incluyen RuntimeException y sus subclases, como NullPointerException, ArrayIndexOutOfBoundsException, etc.
  • Errores (Errors): No son excepciones propiamente dichas, sino problemas que están fuera del control del usuario o del programador.​ Incluye: Stackoverflow, IOError, VirtualMachineError, entre otros.

Fuente: Tutorialspoint

38. ¿Es necesario manejar (catch) un RunTimeException?

No, no es necesario manejar (catch) los RunTimeException, pero es una buena práctica hacerlo. Es recomendable hacer algo para solucionar esta excepción. La mejor práctica es identificar la causa del problema (¿qué es lo que está originando la RunTimeException?) y arreglar el problema.

39. ¿Qué representa la clase Error en Java?

Un Error es un tipo específico de Throwable, al igual que Exception. La clase Error es utilizada para representar problemas que surgen más allá del control del usuario o del programador, como, por ejemplo: desbordamiento de pila, errores de la JVM, agotamiento de memoria (Out of Memory), problemas de verificación del bytecode, entre otros. Estos errores son cosas que el programador no puede ni es capaz de manejar. Son cosas tan graves que el código no es capaz de solucionar de manera segura.

40. ¿Qué hace el recolector de basura (Garbage Collector)?

El recolector de basura es un programa que se ejecuta en la Máquina Virtual de Java (JVM) y se encarga de eliminar los objetos que ya no son utilizados por una aplicación Java. Es una forma de gestión automática de memoria.

Cuando una aplicación Java típica se está ejecutando, crea nuevos objetos, pero después de cierto tiempo, esos objetos ya no se utilizan. El recolector de basura buscará esos objetos y los eliminará, liberando la memoria para que otros nuevos objetos puedan utilizar ese espacio de memoria.

Fuente: Stackoverflow

41. ¿Cuáles son los segmentos de memoria en la JVM?

Cuando una JVM ejecuta un programa compilado en Java, durante la ejecución cuenta con cinco segmentos de memoria:

Registro de Contador de Programa (Program Counter - PC). Este segmento almacena la dirección de memoria de las instrucciones de la Máquina Virtual Java (JVM) que se están ejecutando. Cada vez que se crea un nuevo hilo, se crea un contador de programa. Este contador mantiene un puntero a las sentencias que se están ejecutando en el hilo actual.

Área de método (Method Area): Se utiliza para almacenar información diversa sobre el programa en ejecución. Esta información incluye: información de tipo (si se trata de una clase o una interfaz, modificadores de tipo, superclase, nombre completo), un conjunto de constantes (para almacenar literales), información de campo (nombre, tipo, modificadores) e información de método (nombre, tipo de retorno, número, tipo y orden de los parámetros, modificadores).

Pila de Java (Java Stack): Almacena datos específicos del hilo, como variables locales, referencias de objetos a un montículo (heap), etc. Cada vez que un hilo introduce un nuevo método, se crea un nuevo bloque llamado marco de pila dentro de la memoria de pila para almacenar los detalles específicos del método. Cuando el hilo completa la ejecución de ese método, el marco de pila correspondiente se expulsa de la memoria de pila.

Java Heap: Es el almacenamiento principal dentro de la JVM y guarda todos los objetos nuevos creados durante la ejecución. La memoria del heap es común a todos los hilos y tiene dos partes lógicas: la generación joven y la generación anterior. La generación joven almacena los objetos recién creados. Después de un tiempo, estos objetos se expulsan a la generación anterior. Si la memoria total asignada no es suficiente para almacenar los nuevos objetos, la JVM lanzará un error java.lang.OutOfMemoryError.

Pila de métodos nativos: Similar a la pila de Java, almacena los datos del hilo para las llamadas a métodos nativos.


 


42. ¿Qué son los hilos (threads)? ¿Para qué se utilizan?

Un hilo es una secuencia de ejecución en un programa. La Máquina Virtual de Java permite que una aplicación tenga múltiples hilos de ejecución corriendo concurrentemente.

Los hilos se utilizan en la programación concurrente para tener múltiples líneas de ejecución y múltiples partes del código ejecutándose simultáneamente, dependiendo de las capacidades de la máquina.

Fuente: Oracle

43. ¿Qué son los hilos virtuales (virtual threads)? ¿Cuál es la diferencia entre un hilo virtual y uno hilo de plataforma?

Los hilos virtuales son hilos que no están atados a un hilo de plataforma en particular, mas si corren sobre un hilo de plataforma. Entre sus características están:

·         El número de hilos NO está limitado por el sistema operativo.

·         Los lenguajes de programación pueden crear tantos hilos virtuales como sea requerido por la aplicación

Los hilos virtuales pueden ser suspendidos

 

Por su parte, los hilos de plataforma son hilos que corren sobre un sistema operativo.

ü  El número de hilos está limitado por el sistema operativo.

ü  Los lenguajes de programación pueden crear tantos hilos de plataforma como el SO lo permita

ü  Al crear un hilo, éste captura al hilo del SO por todo su tiempo de vida

Fuente: Oracle Más información: Escuela Spring

44. ¿Cuál es el uso de la palabra clave synchronized en Java?

La palabra clave synchronized en Java es una herramienta esencial en la programación concurrente. Su propósito general es permitir que solo un hilo a la vez acceda a una sección particular del código, protegiendo así variables o datos de ser corrompidos por modificaciones simultáneas de diferentes hilos.

En su nivel más simple, un bloque de código que está marcado como synchronized en Java le indica a la JVM: "solo permite que un hilo esté aquí a la vez".

Fuente: Javamex

45. ¿Cuál es la diferencia entre synchronized, Lock y volatile en Java?

  • synchronized: Bloquea el acceso a un recurso compartido a nivel de método o bloque de código.
  • Lock (de java.util.concurrent): Más flexible que synchronized, permite bloqueos condicionales y justos.
  • volatile: Indica que una variable se debe leer directamente desde la memoria principal, evitando la caché de los hilos.


PREGUNTAS SOBRE BASES DE DATOS

 

46. ¿Qué es una transacción en una base de datos?

Una transacción es un conjunto de operaciones que forman una unidad lógica. Sirve para garantizar que múltiples cambios (por ejemplo, actualizaciones a varias tablas) se completen todos con éxito o ninguno en absoluto, manteniendo la base de datos en un estado consistente. Si algo falla, se puede hacer un rollback para revertir los cambios.

47. ¿Qué son los índices en una base de datos y para qué se usan?

Los índices se usan para mejorar el rendimiento de las búsquedas. Se deben crear cuando se espera hacer búsquedas frecuentes sobre un campo específico.

48. ¿Qué tipos de índices existen en Oracle?

Las bases de datos de Oracle soportan distintos tipos de índices:

  • Índices B-tree: Son los índices por defecto. Son utilizados para datos con alta cardinalidad.
  • Índices bitmap: Almacenan ids de filas (rowids) con una llave valor como un bitmap.
  • Índices particionados: Consisten en particiones, las cuales contienen una entrada por cada valor que aparece en las columnas indexadas de la tabla.
  • Índices basados en funciones: Son índices basados en expresiones. Permiten la construcción de consultas que evalúan el valor retornado por una expresión.
  • Índices de dominio de aplicación: Son instancias del tipo indextype. Un tipo de índice específico por cada aplicación.

Fuente: Oracle


PREGUNTAS SOBRE CONTENEDORES

49. ¿Qué es un contenedor?

Un contenedor es un paquete de software ligero, independiente y ejecutable que incluye todo lo necesario para ejecutar una aplicación: código, entorno de ejecución, herramientas del sistema, bibliotecas del sistema y configuraciones.

Los contenedores están diseñados para aislar las aplicaciones y sus dependencias, garantizando así su ejecución consistente en diferentes entornos, ya sea en el equipo local del desarrollador, en un servidor de pruebas o en producción.

Fuente: Docker

50. ¿Cuál es la diferencia entre un contenedor y una máquina virtual?

Los contenedores y las máquinas virtuales ofrecen ventajas similares en cuanto a aislamiento y asignación de recursos, pero funcionan de forma diferente porque los contenedores virtualizan el sistema operativo en lugar del hardware. De esta manera, los contenedores son más portátiles y eficientes.

Contenedores: Los contenedores son una abstracción en la capa de aplicación que empaqueta el código y las dependencias. Varios contenedores pueden ejecutarse en la misma máquina y compartir el núcleo del sistema operativo con otros contenedores, cada uno ejecutándose como procesos aislados en el espacio de usuario.

Máquinas virtuales: Las máquinas virtuales (VM) son una abstracción del hardware físico que convierte un servidor en muchos. El hipervisor permite que varias VM se ejecuten en una sola máquina. Cada MV incluye una copia completa del sistema operativo, la aplicación, los binarios y las bibliotecas necesarias, ocupando decenas de GB. Las MV también pueden tardar en arrancar.

Fuente: Docker

 

¡Y ahí lo tienes! Esperamos que este listado sea tu fiel compañero en tu búsqueda por ese trabajo ideal. 

Déjanos saber en los comentarios qué otros temas te interesaría que abordaramos. Hasta pronto, y ¡muchos éxitos en tu entrevista!


Comments