¿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
Post a Comment