Introducción
Si estás siendo entrevistado para un rol de programación en Java, probablemente se pondrán a prueba tus habilidades de codificación. Ya seas un principiante en Java o un programador experto, este artículo proporciona algunas preguntas comunes de entrevistas en Java y respuestas para ayudarte a prepararte.
1. ¿Cómo se invierte una cadena en Java?
No existe un método de utilidad reverse()
en la clase String
. Sin embargo, puedes crear un arreglo de caracteres a partir de la cadena y luego iterarlo desde el final hasta el principio. Puedes agregar los caracteres a un constructor de cadenas y finalmente devolver la cadena invertida.
El siguiente código de ejemplo muestra una forma de invertir una cadena:
public class StringPrograms {
public static void main(String[] args) {
String str = "123";
System.out.println(reverse(str));
}
public static String reverse(String in) {
if (in == null)
throw new IllegalArgumentException("Null is not valid input");
StringBuilder out = new StringBuilder();
char[] chars = in.toCharArray();
for (int i = chars.length - 1; i >= 0; i--)
out.append(chars[i]);
return out.toString();
}
}
Puntos extra por agregar una verificación de null
en el método y usar StringBuilder
para agregar los caracteres. Ten en cuenta que el indexado en Java comienza desde 0, por lo que necesitas comenzar en chars.length - 1
en el bucle for
.
2. ¿Cómo intercambiar dos números sin usar una variable auxiliar en Java?
Intercambiar números sin utilizar una variable auxiliar es un proceso de tres pasos que se visualiza mejor en código:
b = b + a; // now b is sum of both the numbers
a = b - a; // b - a = (b + a) - a = b (a is swapped)
b = b - a; // (b + a) - b = a (b is swapped)
El siguiente código de ejemplo muestra una manera de implementar el método de intercambio de números:
public class SwapNumbers {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a is " + a + " and b is " + b);
a = a + b;
b = a - b;
a = a - b;
System.out.println("After swapping, a is " + a + " and b is " + b);
}
}
La salida demuestra que los valores enteros están intercambiados:
Outputa is 10 and b is 20
After swapping, a is 20 and b is 10
3. Escribe un programa en Java para verificar si hay una vocal presente en una cadena.
El siguiente código de ejemplo muestra cómo utilizar una expresión regular para verificar si la cadena contiene vocales:
public class StringContainsVowels {
public static void main(String[] args) {
System.out.println(stringContainsVowels("Hello")); // true
System.out.println(stringContainsVowels("TV")); // false
}
public static boolean stringContainsVowels(String input) {
return input.toLowerCase().matches(".*[aeiou].*");
}
}
4. Escribe un programa en Java para verificar si el número dado es un número primo.
Puedes escribir un programa para dividir el número dado n
por un número del 2 a n
/2 y verificar el residuo. Si el residuo es 0, entonces no es un número primo. El siguiente código de ejemplo muestra una manera de verificar si un número dado es un número primo:
public class PrimeNumberCheck {
public static void main(String[] args) {
System.out.println(isPrime(19)); // verdadero
System.out.println(isPrime(49)); // falso
}
public static boolean isPrime(int n) {
if (n == 0 || n == 1) {
return false;
}
if (n == 2) {
return true;
}
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
Aunque este programa funciona, no es muy eficiente en memoria y tiempo. Considera que, para un número dado N
, si hay un número primo M
entre 2
y √N
(raíz cuadrada de N) que lo divide uniformemente, entonces N
no es un número primo.
5. Escribe un programa en Java para imprimir una secuencia de Fibonacci usando recursividad.
A Fibonacci sequence is one in which each number is the sum of the two previous numbers. In this example, the sequence begins with 0
and 1
. The following example code shows how to use a for
loop to print a Fibonacci sequence:
public class PrintFibonacci {
public static void printFibonacciSequence(int count) {
int a = 0;
int b = 1;
int c = 1;
for (int i = 1; i <= count; i++) {
System.out.print(a + ", ");
a = b;
b = c;
c = a + b;
}
}
public static void main(String[] args) {
printFibonacciSequence(10);
}
}
Output0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
También puedes usar recursividad para imprimir una secuencia de Fibonacci, ya que el número Fibonacci se genera sumando los dos números anteriores en la secuencia:
F(N) = F(N-1) + F(N-2)
La siguiente clase de ejemplo muestra cómo usar la recursividad para calcular una secuencia de Fibonacci de 10 números:
public class PrintFibonacciRecursive {
public static int fibonacci(int count) {
if (count <= 1)
return count;
return fibonacci(count - 1) + fibonacci(count - 2);
}
public static void main(String args[]) {
int seqLength = 10;
System.out.print("A Fibonacci sequence of " + seqLength + " numbers: ");
for (int i = 0; i < seqLength; i++) {
System.out.print(fibonacci(i) + " ");
}
}
}
OutputA Fibonacci sequence of 10 numbers: 0 1 1 2 3 5 8 13 21 34
6. ¿Cómo se verifica si una lista de enteros contiene solo números impares en Java?
Puedes usar un bucle for
y verificar si cada elemento es impar:
public static boolean onlyOddNumbers(List<Integer> list) {
for (int i : list) {
if (i % 2 == 0)
return false;
}
return true;
}
Si la lista es grande, puedes utilizar un flujo paralelo para un procesamiento más rápido, como se muestra en el siguiente código de ejemplo:
public static boolean onlyOddNumbers(List<Integer> list) {
return list
.parallelStream() // flujo paralelo para un procesamiento más rápido
.anyMatch(x -> x % 2 != 0); // regresa tan pronto como coincida algún elemento con la condición
}
Para obtener más información sobre la matemática detrás de determinar si un entero es impar, consulta la Operación de módulo en Wikipedia.
7. ¿Cómo se verifica si una cadena es un palíndromo en Java?
A palindrome string is the same string backwards or forwards. To check for a palindrome, you can reverse the input string and check if the result is equal to the input. The following example code shows how to use the String charAt(int index)
method to check for palindrome strings:
boolean checkPalindromeString(String input) {
boolean result = true;
int length = input.length();
for (int i = 0; i < length/2; i++) {
if (input.charAt(i) != input.charAt(length - i - 1)) {
result = false;
break;
}
}
return result;
}
8. ¿Cómo se eliminan los espacios de una cadena en Java?
El siguiente código de ejemplo muestra una forma de eliminar espacios de una cadena utilizando el método Character.isWhitespace()
:
String removeWhiteSpaces(String input) {
StringBuilder output = new StringBuilder();
char[] charArray = input.toCharArray();
for (char c : charArray) {
if (!Character.isWhitespace(c))
output.append(c);
}
return output.toString();
}
Aprende más sobre cómo eliminar espacios y otros caracteres de una cadena en Java.
9. ¿Cómo se eliminan los espacios iniciales y finales de una cadena en Java?
La clase String
contiene dos métodos para eliminar espacios iniciales y finales: trim()
y strip()
. El método strip()
se agregó a la clase String
en Java 11. El método strip()
utiliza el método Character.isWhitespace()
para verificar si el carácter es un espacio en blanco. Este método utiliza puntos de código Unicode, mientras que el método trim()
identifica cualquier carácter con un valor de punto de código menor o igual a U+0020
como un carácter de espacio en blanco.
El método strip()
es la forma recomendada de eliminar espacios en blanco porque utiliza el estándar Unicode. El siguiente código de ejemplo muestra cómo usar el método strip()
para eliminar espacios en blanco:
String s = " abc def\t";
s = s.strip();
System.out.println(s);
Debido a que String
es inmutable, debes asignar la salida de strip()
a la cadena.
10. ¿Cómo se ordena un array en Java?
La clase de utilidad Arrays
tiene muchos métodos sobrecargados de sort()
para ordenar arrays de primitivos y objetos. Si estás ordenando un array de primitivos en el orden natural, entonces puedes usar el método Arrays.sort()
, como se muestra en el siguiente ejemplo:
int[] array = {1, 2, 3, -1, -2, 4};
Arrays.sort(array);
System.out.println(Arrays.toString(array));
Sin embargo, si quieres ordenar un array de objetos, entonces el objeto debe implementar la interfaz Comparable
. Si deseas especificar los criterios de ordenamiento, puedes pasar el Comparator
para la lógica de ordenamiento. Aprende más sobre Comparable y Comparator en Java.
11. ¿Cómo se crea un escenario de bloqueo mutuo programáticamente en Java?
El bloqueo mutuo es un escenario en un entorno Java multi-hilo donde dos o más hilos están bloqueados para siempre. La situación de bloqueo mutuo surge con al menos dos hilos. El siguiente código de ejemplo crea un escenario de bloqueo mutuo:
public class ThreadDeadlock {
public static void main(String[] args) throws InterruptedException {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
Thread t3 = new Thread(new SyncThread(obj3, obj1), "t3");
t1.start();
Thread.sleep(5000);
t2.start();
Thread.sleep(5000);
t3.start();
}
}
class SyncThread implements Runnable {
private Object obj1;
private Object obj2;
public SyncThread(Object o1, Object o2) {
this.obj1 = o1;
this.obj2 = o2;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " acquiring lock on " + obj1);
synchronized (obj1) {
System.out.println(name + " acquired lock on " + obj1);
work();
System.out.println(name + " acquiring lock on " + obj2);
synchronized (obj2) {
System.out.println(name + " acquired lock on " + obj2);
work();
}
System.out.println(name + " released lock on " + obj2);
}
System.out.println(name + " released lock on " + obj1);
System.out.println(name + " finished execution.");
}
private void work() {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Los tres hilos podrán adquirir un bloqueo en el primer objeto. Sin embargo, están utilizando recursos compartidos y se inician de tal manera que seguirán esperando indefinidamente para adquirir el bloqueo en el segundo objeto. Puede utilizar el volcado de hilos de Java para detectar los bloqueos. Aprenda más sobre el bloqueo en Java.
12. ¿Cómo se puede encontrar el factorial de un entero en Java?
El factorial de un entero se calcula multiplicando todos los números desde 1 hasta el número dado:
F(n) = F(1)*F(2)...F(n-1)*F(n)
El siguiente código de ejemplo muestra cómo usar la recursión para encontrar el factorial de un entero:
public static long factorial(long n) {
if (n == 1)
return 1;
else
return (n * factorial(n - 1));
}
13. ¿Cómo se invierte una lista enlazada en Java?
LinkedList descendingIterator()
devuelve un iterador que itera sobre los elementos en orden inverso. El siguiente código de ejemplo muestra cómo usar este iterador para crear una nueva lista enlazada con los elementos listados en orden inverso:
LinkedList<Integer> ll = new LinkedList<>();
ll.add(1);
ll.add(2);
ll.add(3);
System.out.println(ll);
LinkedList<Integer> ll1 = new LinkedList<>();
ll.descendingIterator().forEachRemaining(ll1::add);
System.out.println(ll1);
Aprende más sobre cómo invertir una lista enlazada desde una perspectiva de estructuras de datos y algoritmos.
14. ¿Cómo se implementa una búsqueda binaria en Java?
Los elementos del arreglo deben estar ordenados para implementar la búsqueda binaria. El algoritmo de búsqueda binaria se basa en las siguientes condiciones:
- Si la clave es menor que el elemento medio, entonces ahora debes buscar solo en la primera mitad del arreglo.
- Si la clave es mayor que el elemento medio, entonces debes buscar solo en la segunda mitad del arreglo.
- Si la clave es igual al elemento medio en el arreglo, entonces la búsqueda termina.
- Finalmente, si la clave no se encuentra en todo el arreglo, entonces debería devolver
-1
. Esto indica que el elemento no está presente.
El siguiente código de ejemplo implementa una búsqueda binaria:
public static int binarySearch(int arr[], int low, int high, int key) {
int mid = (low + high) / 2;
while (low <= high) {
if (arr[mid] < key) {
low = mid + 1;
} else if (arr[mid] == key) {
return mid;
} else {
high = mid - 1;
}
mid = (low + high) / 2;
}
if (low > high) {
return -1;
}
return -1;
}
15. Escribe un programa Java que ilustre la ordenación por mezcla.
El merge sort es uno de los algoritmos de ordenamiento más eficientes. Funciona según el principio de “dividir y conquistar”. Se basa en la idea de descomponer una lista en varias sub-listas hasta que cada sub-lista consista en un solo elemento, y luego fusionar esas sub-listas de manera que resulte en una lista ordenada. El siguiente ejemplo de código muestra una forma de usar el merge sort:
public class MergeSort {
public static void main(String[] args) {
int[] arr = { 70, 50, 30, 10, 20, 40, 60 };
int[] merged = mergeSort(arr, 0, arr.length - 1);
for (int val : merged) {
System.out.print(val + " ");
}
}
public static int[] mergeTwoSortedArrays(int[] one, int[] two) {
int[] sorted = new int[one.length + two.length];
int i = 0;
int j = 0;
int k = 0;
while (i < one.length && j < two.length) {
if (one[i] < two[j]) {
sorted[k] = one[i];
k++;
i++;
} else {
sorted[k] = two[j];
k++;
j++;
}
}
if (i == one.length) {
while (j < two.length) {
sorted[k] = two[j];
k++;
j++;
}
}
if (j == two.length) {
while (i < one.length) {
sorted[k] = one[i];
k++;
i++;
}
}
return sorted;
}
public static int[] mergeSort(int[] arr, int lo, int hi) {
if (lo == hi) {
int[] br = new int[1];
br[0] = arr[lo];
return br;
}
int mid = (lo + hi) / 2;
int[] fh = mergeSort(arr, lo, mid);
int[] sh = mergeSort(arr, mid + 1, hi);
int[] merged = mergeTwoSortedArrays(fh, sh);
return merged;
}
}
16. ¿Puedes crear una pirámide de caracteres en Java?
Los programas de patrones son un tema de entrevista muy popular. Este tipo de pregunta se utiliza para comprender las habilidades de pensamiento lógico del entrevistado. Consulta Programas de Patrones de Pirámides en Java para ejemplos de diferentes formas de crear patrones de pirámides.
17. Escribe un programa en Java que compruebe si dos arrays contienen los mismos elementos.
Para verificar si dos arrays contienen los mismos elementos, primero debes crear un conjunto de elementos a partir de ambos arrays y luego comparar los elementos en estos conjuntos para ver si hay un elemento que no está presente en ambos conjuntos. El siguiente código de ejemplo muestra cómo verificar si dos arrays solo contienen elementos comunes:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class ArraySameElements {
public static void main(String[] args) {
Integer[] a1 = {1,2,3,2,1};
Integer[] a2 = {1,2,3};
Integer[] a3 = {1,2,3,4};
System.out.println(sameElements(a1, a2));
System.out.println(sameElements(a1, a3));
}
static boolean sameElements(Object[] array1, Object[] array2) {
Set<Object> uniqueElements1 = new HashSet<>(Arrays.asList(array1));
Set<Object> uniqueElements2 = new HashSet<>(Arrays.asList(array2));
// si el tamaño es diferente, significa que habrá una discrepancia
if (uniqueElements1.size() != uniqueElements2.size()) return false;
for (Object obj : uniqueElements1) {
// ¿elemento no presente en ambos?
if (!uniqueElements2.contains(obj)) return false;
}
return true;
}
}
Outputtrue
false
18. ¿Cómo obtienes la suma de todos los elementos en un array de enteros en Java?
Puedes usar un bucle for
para iterar sobre los elementos del array y sumarlos para obtener la suma final:
int[] array = { 1, 2, 3, 4, 5 };
int sum = 0;
for (int i : array)
sum += i;
System.out.println(sum);
19. ¿Cómo encuentras el segundo número más grande en un array en Java?
Hay muchas formas de resolver este problema. Puedes ordenar el array en orden ascendente natural y tomar el segundo valor. Sin embargo, la ordenación es una operación costosa. También puedes usar dos variables para encontrar el segundo valor más grande en una sola iteración, como se muestra en el siguiente ejemplo:
private static int findSecondHighest(int[] array) {
int highest = Integer.MIN_VALUE;
int secondHighest = Integer.MIN_VALUE;
for (int i : array) {
if (i > highest) {
secondHighest = highest;
highest = i;
} else if (i > secondHighest) {
secondHighest = i;
}
}
return secondHighest;
}
20. ¿Cómo se baraja un array en Java?
El siguiente código de ejemplo muestra cómo utilizar la clase Random
para generar números de índice aleatorios y barajar los elementos:
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
Random rand = new Random();
for (int i = 0; i < array.length; i++) {
int randomIndexToSwap = rand.nextInt(array.length);
int temp = array[randomIndexToSwap];
array[randomIndexToSwap] = array[i];
array[i] = temp;
}
System.out.println(Arrays.toString(array));
Puedes ejecutar el código de barajado dentro de otro bucle for
para barajar múltiples rondas.
21. ¿Cómo puedes encontrar una cadena en un archivo de texto en Java?
El siguiente código de ejemplo muestra cómo utilizar la clase Scanner
para leer el contenido del archivo línea por línea y luego utilizar el método String contains()
para verificar si la cadena está presente en el archivo:
boolean findStringInFile(String filePath, String str) throws FileNotFoundException {
File file = new File(filePath);
Scanner scanner = new Scanner(file);
// leer el archivo línea por línea
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains(str)) {
scanner.close();
return true;
}
}
scanner.close();
return false;
}
Nótese que el código de ejemplo asume que la cadena que estás buscando en el archivo no contiene caracteres de nueva línea.
22. ¿Cómo imprimes una fecha en un formato específico en Java?
El siguiente código de ejemplo muestra cómo utilizar la clase SimpleDateFormat
para formatear la cadena de fecha:
String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date); // 06-23-2020
Aprende más sobre la clase Java SimpleDateFormat.
23. ¿Cómo se fusionan dos listas en Java?
El siguiente código de ejemplo muestra cómo utilizar el método addAll()
para fusionar múltiples listas en Java:
List<String> list1 = new ArrayList<>();
list1.add("1");
List<String> list2 = new ArrayList<>();
list2.add("2");
List<String> mergedList = new ArrayList<>(list1);
mergedList.addAll(list2);
System.out.println(mergedList); // [1, 2]
24. Escribe un programa Java que ordene un HashMap por valor.
HashMap
no es una colección ordenada. El siguiente código de ejemplo muestra cómo ordenar las entradas según el valor y almacenarlas en un LinkedHashMap
, que mantiene el orden de inserción:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class SortHashMapByValue {
public static void main(String[] args) {
Map<String, Integer> scores = new HashMap<>();
scores.put("David", 95);
scores.put("Jane", 80);
scores.put("Mary", 97);
scores.put("Lisa", 78);
scores.put("Dino", 65);
System.out.println(scores);
scores = sortByValue(scores);
System.out.println(scores);
}
private static Map<String, Integer> sortByValue(Map<String, Integer> scores) {
Map<String, Integer> sortedByValue = new LinkedHashMap<>();
// obtener el conjunto de entradas
Set<Entry<String, Integer>> entrySet = scores.entrySet();
System.out.println(entrySet);
// crear una lista ya que el conjunto está desordenado
List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
System.out.println(entryList);
// ordenar la lista por valor
entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
System.out.println(entryList);
// poblar el nuevo mapa hash
for (Entry<String, Integer> e : entryList)
sortedByValue.put(e.getKey(), e.getValue());
return sortedByValue;
}
}
25. ¿Cómo se eliminan todas las ocurrencias de un carácter dado de una cadena de entrada en Java?
La clase String
no tiene un método para eliminar caracteres. El siguiente ejemplo muestra cómo usar el método replace()
para crear una nueva cadena sin el carácter dado:
String str1 = "abcdABCDabcdABCD";
str1 = str1.replace("a", "");
System.out.println(str1); // bcdABCDbcdABCD
Las cadenas son inmutables en Java. Todos los métodos de manipulación de cadenas devuelven una nueva cadena, por eso es necesario asignarla a otra variable. Obtenga más información sobre cómo eliminar caracteres de una cadena en Java.
26. ¿Cómo obtienes caracteres distintos y su cantidad en una cadena en Java?
Puedes crear un arreglo de caracteres a partir de la cadena. Luego, iterar sobre él y crear un HashMap
con el carácter como clave y su cantidad como valor. El siguiente ejemplo de código muestra cómo extraer y contar los caracteres de una cadena:
String str1 = "abcdABCDabcd";
char[] chars = str1.toCharArray();
Map<Character, Integer> charsCount = new HashMap<>();
for (char c : chars) {
if (charsCount.containsKey(c)) {
charsCount.put(c, charsCount.get(c) + 1);
} else
charsCount.put(c, 1);
}
System.out.println(charsCount); // {a=2, A=1, b=2, B=1, c=2, C=1, d=2, D=1}
27. ¿Puedes demostrar que un objeto String
en Java es inmutable programáticamente?
El siguiente ejemplo de código muestra cómo demostrar que un objeto String
es inmutable y los comentarios en el código explican cada paso:
String s1 = "Java"; // Se crea el String "Java" en el pool y se asigna la referencia a s1
String s2 = s1; // s2 también tiene la misma referencia a "Java" en el pool
System.out.println(s1 == s2); // prueba de que s1 y s2 tienen la misma referencia
s1 = "Python";
// el valor de s1 se cambió anteriormente, ¿cómo es inmutable String?
// en el caso anterior se creó un nuevo String "Python" en el pool
// s1 ahora se refiere al nuevo String en el pool
// PERO, el String original "Java" sigue sin cambios y permanece en el pool
// s2 todavía se refiere al String original "Java" en el pool
// prueba de que s1 y s2 tienen referencias diferentes
System.out.println(s1 == s2);
System.out.println(s2);
// imprime "Java" apoyando el hecho de que el valor original de String no ha cambiado, por lo tanto, String es inmutable
28. ¿Puedes escribir un código para mostrar la herencia en Java?
El siguiente código de ejemplo muestra cómo usar la palabra clave extends
para crear una subclase de la clase Animal
. La nueva clase Cat
hereda la variable de la clase Animal
y agrega más código que solo pertenece a la clase Cat
.
class Animal {
String color;
}
class Cat extends Animal {
void meow() {
System.out.println("Meow");
}
}
29. ¿Cómo se muestra un problema de diamante con herencia múltiple en Java?
El problema del diamante ocurre cuando una clase hereda de múltiples clases y surge ambigüedad cuando no está claro qué método ejecutar de qué clase. Java no permite extender múltiples clases para evitar el problema del diamante, como se ilustra en el siguiente ejemplo:
interface I {
void foo();
}
class A implements I {
public void foo() {}
}
class B implements I {
public void foo() {}
}
class C extends A, B { // no se compilará
public void bar() {
super.foo();
}
}
30. ¿Cómo se ilustra un ejemplo de try catch en Java?
El siguiente código de ejemplo muestra un ejemplo de try-catch:
try {
FileInputStream fis = new FileInputStream("test.txt");
} catch(FileNotFoundException e) {
e.printStackTrace();
}
A partir de Java 7, también puedes capturar múltiples excepciones en un solo bloque catch, como se muestra en el siguiente ejemplo. Es útil cuando tienes el mismo código en todos los bloques catch.
public static void foo(int x) throws IllegalArgumentException, NullPointerException {
// algún código
}
public static void main(String[] args) {
try {
foo(10);
} catch (IllegalArgumentException | NullPointerException e) {
System.out.println(e.getMessage());
}
}
31. Escriba un programa Java para mostrar una NullPointerException
.
Si está llamando a una función en null
, lanzará una NullPointerException
, como se muestra en el siguiente código de ejemplo:
public static void main(String[] args) {
printString(null, 3);
}
static void printString(String s, int count) {
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase()); // Excepción en el hilo "main" java.lang.NullPointerException
}
}
Debería tener una comprobación de nulidad en su lugar para validación temprana, como se muestra en el siguiente código de ejemplo:
static void printString(String s, int count) {
if (s == null) return;
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase());
}
}
También puede lanzar IllegalArgumentException
según los requisitos del proyecto.
32. ¿Cómo se crea un registro en Java?
Los registros se agregaron como una característica estándar en Java 16. Los registros le permiten crear una clase POJO con código mínimo. Los registros generan automáticamente el código de los métodos hashCode()
, equals()
, los métodos getter y el método toString()
para la clase. Los registros son finales e implícitamente extienden la clase java.lang.Record
. El siguiente código de ejemplo muestra una forma de crear un registro:
import java.util.Map;
public record EmpRecord(int id, String name, long salary, Map<String, String> addresses) {
}
Aprende más sobre registros en Java. Para obtener detalles sobre POJO, consulta Plain old Java object en Wikipedia.
33. ¿Cómo se crean bloques de texto en Java?
Java 15 agregó la función de bloques de texto. Puedes crear cadenas multilinea usando bloques de texto. La cadena multilinea debe escribirse dentro de un par de triples comillas dobles, como se muestra en el siguiente ejemplo:
String textBlock = """
Hi
Hello
Yes""";
Es lo mismo que crear una cadena, como Hi\\nHello\\nYes
.
34. Muestra un ejemplo de expresiones de cambio y declaraciones de casos de múltiples etiquetas en Java.
Las expresiones de cambio se añadieron como una característica estándar en Java 14. Los siguientes ejemplos muestran expresiones de cambio, así como declaraciones de casos de múltiples etiquetas:
int choice = 2;
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x); // x = 2
También puedes usar expresiones lambda en expresiones de cambio.
String day = "TH";
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if (day.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
System.out.println(result); // TTH
35. ¿Cómo se compila y ejecuta una clase Java desde la línea de comandos?
Este ejemplo se refiere al siguiente archivo Java:
public class Test {
public static void main(String args[]) {
System.out.println("Hi");
}
}
Puedes compilarlo usando el siguiente comando en tu terminal:
- javac Test.java
Para ejecutar la clase, usa el siguiente comando en tu terminal:
- java Test
Para las versiones recientes, el comando java
también compilará el programa si el archivo de clase no está presente. Si la clase está en un paquete, como com.example
, entonces debería estar dentro de la carpeta com/example
. El comando para compilar y ejecutar es:
- java com/example/Test.java
Si tu clase requiere algunos JARs adicionales para compilar y ejecutar, puedes usar la opción java -cp
. Por ejemplo:
- java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java
36. ¿Cómo se crea un enum en Java?
El siguiente código de ejemplo muestra cómo crear un enum básico:
public enum ThreadStates {
START,
RUNNING,
WAITING,
DEAD;
}
ThreadStates
es el enum con campos constantes fijos START
, RUNNING
, WAITING
y DEAD
. Todos los enums extienden implícitamente la clase java.lang.Enum
e implementan las interfaces Serializable
y Comparable
. Los enums también pueden tener métodos. Obtén más información sobre enums en Java.
37. ¿Cómo se usa el método forEach()
en Java?
El método forEach()
proporciona un atajo para realizar una acción en todos los elementos de un iterable. El siguiente ejemplo de código muestra cómo iterar sobre los elementos de una lista e imprimirlos:
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Puedes usar el método forEach()
con una expresión lambda para reducir el tamaño del código, como se muestra en el siguiente ejemplo de código:
List<String> list = new ArrayList<>();
list.forEach(System.out::print);
38. ¿Cómo escribes una interfaz con método default
y static
en Java?
Java 8 introdujo métodos por defecto y estáticos en interfaces. Esto cerró la brecha entre las interfaces y las clases abstractas. El siguiente código de ejemplo muestra una forma de escribir una interfaz con el método default
y el método static
:
public interface Interface1 {
// método abstracto regular
void method1(String str);
default void log(String str) {
System.out.println("I1 logging::" + str);
}
static boolean isNull(String str) {
System.out.println("Interface Null Check");
return str == null ? true : "".equals(str) ? true : false;
}
}
Aprende más sobre los métodos default
y static
en interfaces en Java 8 cambios en la interfaz.
39. ¿Cómo se crea una interfaz funcional?
Una interfaz con exactamente un método abstracto se llama interfaz funcional. El principal beneficio de las interfaces funcionales es que puedes usar expresiones lambda para instanciarlas y evitar el uso de una implementación de clase anónima voluminosa. La anotación @FunctionalInterface
indica una interfaz funcional, como se muestra en el siguiente código de ejemplo:
@FunctionalInterface
interface Foo {
void test();
}
40. Muestra un ejemplo de uso de expresiones lambda en Java.
Runnable
es un excelente ejemplo de una interfaz funcional. Puedes usar expresiones lambda para crear un runnable, como se muestra en el siguiente código de ejemplo:
Runnable r1 = () -> System.out.println("My Runnable");
41. Muestra ejemplos de sobrecarga y anulación en Java.
Cuando una clase tiene dos o más métodos con el mismo nombre, se llaman métodos sobrecargados. El siguiente código de ejemplo muestra un método sobrecargado llamado print
:
class Foo {
void print(String s) {
System.out.println(s);
}
void print(String s, int count) {
while (count > 0) {
System.out.println(s);
count--;
}
}
}
Cuando un método de la superclase también está implementado en la clase hija, se llama anulación. El siguiente código de ejemplo muestra cómo anotar el método printname()
que está implementado en ambas clases:
class Base {
void printName() {
System.out.println("Base Class");
}
}
class Child extends Base {
@Override
void printName() {
System.out.println("Child Class");
}
}
Aprende más sobre anulación y sobrecarga en Java.
42.-49. Adivina la Salida
Ponte a prueba adivinando la salida de los siguientes fragmentos de código.
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
Output
false
La salida de la declaración dada es false
porque el operador +
tiene una precedencia más alta que el operador ==
. Así que la expresión dada se evalúa como “s1 == s2 is:abc” == “abc”
, que es false
.
String s3 = "JournalDev";
int start = 1;
char end = 5;
System.out.println(s3.substring(start, end));
Output
ourn
La salida de la declaración dada es ourn
. El primer carácter se convierte automáticamente a int
. Luego, dado que el índice del primer carácter es 0, comenzará desde o
e imprimirá hasta n
. Ten en cuenta que el método String substring
crea una subcadena que comienza en el índice start
y se extiende hasta el carácter en el índice end - 1
.
HashSet shortSet = new HashSet();
for (short i = 0; i < 100; i++) {
shortSet.add(i);
shortSet.remove(i - 1);
}
System.out.println(shortSet.size());
Output
100
El tamaño del shortSet
es 100
. La característica de autoboxing en Java significa que la expresión i
, que tiene el tipo primitivo short
, se convierte en un objeto Short
. De manera similar, la expresión i - 1
tiene el tipo primitivo int
y se autoboxea a un objeto Integer
. Dado que no hay ningún objeto Integer
en el HashSet
, nada se elimina y el tamaño es 100
.
try {
if (flag) {
while (true) {
}
} else {
System.exit(1);
}
} finally {
System.out.println("In Finally");
}
Output
Sin salida. Este código resulta en un bucle infinito si el indicador es true
y el programa sale si el indicador es false
. El bloque finally
nunca se alcanzará.
String str = null;
String str1="abc";
System.out.println(str1.equals("abc") | str.equals(null));
Output
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "<local1>" is null
La declaración de impresión dada lanzará una java.lang.NullPointerException
porque el operador lógico OR
evalúa ambos literales antes de devolver el resultado. Dado que str
es null
, el método .equals()
lanzará una excepción. Siempre es recomendable usar operadores lógicos de cortocircuito, como ||
y &&
, que evalúan los valores literales de izquierda a derecha. En este caso, dado que el primer literal devolvería true
, omitiría la evaluación del segundo literal.
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
Output
abc
El x.concat(y)
crea una nueva cadena pero no se asigna a x
, así que el valor de x
no cambia.
public class MathTest {
public void main(String[] args) {
int x = 10 * 10 - 10;
System.out.println(x);
}
}
Output
Error: Main method is not static in class MathTest, please define the main method as:
public static void main(String[] args)
Aunque pueda parecer que esta pregunta trata sobre el orden de ejecución de los operadores matemáticos, en realidad se trata de notar que el método principal no se declaró static
.
public class Test {
public static void main(String[] args) {
try {
throw new IOException("Hello");
} catch(IOException | Exception e) {
System.out.println(e.getMessage());
}
}
}
Output
Test.java:5: error: cannot find symbol
throw new IOException("Hello");
^
symbol: class IOException
location: class Test
Test.java:6: error: cannot find symbol
}catch(IOException | Exception e) {
^
symbol: class IOException
location: class Test
2 errors
Este código resulta en un error en tiempo de compilación. La excepción IOException
ya está capturada por la alternativa Exception
.
50. Encuentra 5 errores en el siguiente fragmento de código.
package com.digitalocean.programming-interviews;
public class String Programs {
static void main(String[10] args) {
String s = "abc"
System.out.println(s);
}
}
Answers
- El nombre del paquete no puede tener guiones.
- El nombre de la clase no puede tener espacios.
- El método principal no es
public
, así que no se ejecutará. - El argumento del método principal no debería especificar el tamaño.
- Falta el punto y coma en la definición de la cadena.
Conclusión
Esta colección de 50 preguntas de entrevista de programación en Java incluyó preguntas desde nivel principiante hasta experto, para ayudarte a prepararte para tu entrevista.
Lectura recomendada:
Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions