¿Listo para poner a prueba tus habilidades en Java? Aprender la sintaxis es solo el primer paso. El verdadero dominio llega cuando te enfrentas a desafíos y los resuelves.
Muchos tutoriales se quedan en el “Hola, Mundo“, pero aquí he preparado una colección de problemas de programación java para que pases de la teoría a la acción.
En este artículo, te guiaré a través de varios problemas en Java resueltos, desde calcular factoriales y ordenar números hasta otras operaciones de utilidad. Mi objetivo es que no solo copies el código, sino que entiendas la lógica detrás de cada solución.
Para empezar a practicar con problemas Java, aquí tienes una colección de ejercicios fundamentales que te ayudarán a dominar la lógica de programación:
- Cálculo de factoriales.
- Búsqueda del número mayor en un array.
- Generación de la secuencia de Fibonacci.
- Determinación de números primos.
- Inversión de una cadena de texto.
- Ordenación de números enteros.

¿Qué es Java y Por Qué Sigue Siendo Relevante?
Java es un lenguaje de programación creado en 1995 por Sun Microsystems. A principios de la década de 1990, Sun intentó desarrollar una plataforma para dispositivos electrónicos de consumo.
El resultado fue la creación de un lenguaje llamado Oak, que posteriormente fue renombrado como Java. Para entenderlo a fondo, te recomiendo mi guía sobre qué es Java.
Características del Lenguaje
- Los programas escritos en este lenguaje pueden ejecutarse en cualquier dispositivo que disponga de la Máquina Virtual de Java (JVM, por sus siglas en inglés). El código fuente de Java se compila a un bytecode especial, que luego es ejecutado en el entorno de la JVM. Si quieres saber más sobre esto, puedes consultar mi artículo sobre qué es el JDK y para qué sirve.
- Java es un lenguaje fuertemente tipado, lo que implica que todas las variables y expresiones tienen un tipo definido que debe ser especificado. Esto ayuda a prevenir errores y aumenta la fiabilidad del código.
- Java es un lenguaje orientado a objetos, lo que significa que casi todo se representa mediante objetos. Sin embargo, existen tipos primitivos (como
int,char,boolean, etc.) que no son objetos, aunque pueden envolverse mediante clases comoIntegeroBoolean. - Java gestiona la memoria de forma automática, liberándola de datos innecesarios (recolección de basura). Esto simplifica el desarrollo y contribuye a la estabilidad de las aplicaciones.
- Java es un lenguaje relativamente simple para principiantes, pero a la vez robusto y escalable para proyectos de gran envergadura. Cuenta con una comunidad extensa y una gran cantidad de excelentes IDEs para Java que facilitan el desarrollo.
- Desventajas de Java: puede presentar un alto consumo de memoria y su ejecución puede ser más lenta en comparación con otros lenguajes. Además, desde 2019, el uso comercial del JDK de Oracle requiere una suscripción de pago, aunque siguen existiendo numerosas distribuciones de Java gratuitas y actualizadas basadas en OpenJDK.
Ámbitos de Aplicación de Java
Java se utiliza en diversos campos. Por ejemplo, es el lenguaje principal para el desarrollo de aplicaciones en la plataforma Android. También se emplea para la creación de sitios web y aplicaciones empresariales.
Java es fundamental para el procesamiento de grandes volúmenes de datos (Big Data) y en aplicaciones científicas. Se utiliza en sistemas embebidos y en el desarrollo de videojuegos, como Minecraft o RuneScape.
Java presenta una alta demanda en el mercado laboral. Los desarrolladores con conocimientos en Java pueden acceder a salarios competitivos y a menudo tienen la opción de trabajar de forma remota. En comparación con Python, Java es más complejo de aprender, pero ofrece un mayor rendimiento.
A diferencia de C#, Java es considerado más seguro al no utilizar punteros, lo que lo hace ideal para la creación de aplicaciones empresariales. Si te interesa este tema, puedes leer mi comparativa sobre las diferencias entre C# y Java.
«Hola, Mundo!» en Java
Este programa suele ser el punto de partida en el aprendizaje de la programación. Como en muchos otros lenguajes, el punto de entrada en Java es el método main:
public class HolaMundo {
public static void main(String[] args) {
System.out.println("Hola, Mundo!");
}
}Salida en la consola:
Hola, Mundo!Imprimir Números del 1 al 10
Una tarea fundamental. Para su solución, se puede utilizar un bucle for:
public class ImprimirNumeros {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.print(i + " ");
}
}
}Salida:
1 2 3 4 5 6 7 8 9 10Cálculo del Factorial
El factorial de un número es el producto de todos los números naturales desde 1 hasta dicho número, inclusive. Se denota con un signo de exclamación (!). Si quieres profundizar en el concepto matemático, aquí explico en detalle qué es un factorial y cómo se calcula. Ejemplos de cálculo de factoriales:
1! = 1
2 ! = 1 * 2 = 2
3 ! = 1 * 2 * 3 = 6
4 ! = 1 * 2 * 3 * 4 = 24
5 ! = 1 * 2 * 3 * 4 * 5 = 120
6 ! = 1 * 2 * 3 * 4 * 5 * 6 = 720En Java, el factorial se puede calcular de la siguiente manera:
public class CalculoFactorial {
public static void main(String[] args) {
int number = 6;
long result = 1;
for (int i = 1; i <= number; i++) {
result = result * i;
}
System.out.println(number + "!=" + result);
}
}Como ves, el procedimiento es simple. He usado un tipo long para la variable result para poder calcular factoriales más grandes sin errores. Para números aún mayores (superiores a 20!), sería necesario utilizar la clase BigInteger para evitar un desbordamiento (overflow). Para el ejemplo anterior, el resultado en la consola será:
6!=720Búsqueda del Número Mayor
Supongamos que tenemos la siguiente secuencia de números enteros:
5, 3, -2, 9, 1, -8Y se requiere encontrar el número mayor. En Java, esto se puede lograr fácilmente mediante un bucle for y un operador condicional if:
public class EncontrarMaximo {
public static void main(String[] args) {
int[] numbers = {5, 3, -2, 9, 1, -8};
int maxNumber = numbers[0];
for (int number : numbers) {
if (number > maxNumber) {
maxNumber = number;
}
}
System.out.println(maxNumber);
}
}A partir de los números, creamos un array numbers y asignamos el primer elemento del array a la variable maxNumber. Luego, mediante un bucle, recorremos todos los elementos del array y si alguno de los elementos es mayor que maxNumber, se le asigna el valor de ese elemento a la variable maxNumber. Si ejecutas el código anterior, obtendrás lo siguiente en la consola:
9
Generación de la Secuencia de Fibonacci
La secuencia de Fibonacci está compuesta por números enteros, donde los dos primeros son 0 y 1, y cada número siguiente es la suma de los dos anteriores. Puedes aprender más sobre la teoría detrás de los números de Fibonacci en programación en mi otro artículo.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, ...En Java, los primeros 20 números de esta secuencia se pueden obtener así:
public class SecuenciaFibonacci {
public static void main(String[] args) {
int[] arr = new int[20];
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i < arr.length; ++i) {
arr[i] = arr[i - 1] + arr[i - 2];
}
for (int j : arr) {
System.out.print(j + " ");
}
}
}Creamos un array de 20 elementos. Inicializamos los dos primeros con cero y uno. El primer bucle calcula cada elemento y el segundo los imprime. Nota importante: los números de Fibonacci crecen exponencialmente, por lo que a partir del término 47 se produce un desbordamiento (overflow) del tipo int. Para secuencias más largas, se debería usar long o BigInteger. La salida del código anterior será:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181Determinación de Números Primos
Los números primos son aquellos que solo son divisibles por 1 y por sí mismos.
En Java existe la clase BigInteger, que se utiliza para operaciones con números grandes y en esta clase hay un método isProbablePrime, que sirve para determinar la primalidad de los números basándose en el test probabilístico de Miller-Rabin. Primero, importamos la clase BigInteger al principio del archivo fuente y solo después la usamos en el código:
import java.math.BigInteger;
public class ComprobarPrimo {
public static void main(String[] args) {
Integer integer = 5;
BigInteger bigInteger = BigInteger.valueOf(integer);
boolean probablePrimeNumber = bigInteger.isProbablePrime(100);
System.out.println(probablePrimeNumber);
}
}El método isProbablePrime recibe un parámetro de “certeza”, que indica la rigurosidad de la prueba. El método devuelve true o false. Así, si ejecutas el código anterior, obtendrás el siguiente resultado en la consola:
trueEsto significa que el número 5 es primo. Y si tomamos, por ejemplo, el número 7638, obtendremos:
falseEste es un gran ejemplo de cómo solucionar problemas en Java utilizando las librerías estándar del lenguaje.
Determinación de un Año Bisiesto
Un año bisiesto es aquel que contiene un día adicional (29 de febrero). Un año bisiesto:
- Es divisible por 4 sin residuo, Y no es divisible por 100 sin residuo.
- O es divisible por 400 sin residuo.
Teniendo en cuenta todo lo anterior, se puede escribir el siguiente programa en Java:
public class AnioBisiesto {
public static void main(String[] args) {
int year = 2020;
if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
System.out.println(year + " - es un año bisiesto");
} else {
System.out.println(year + " - no es un año bisiesto");
}
}
}En la consola obtendremos:
2020 - es un año bisiestoPero también podemos simplificar el código si usamos el método isLeap de la clase Year, introducida en Java 8 como parte de la nueva API de Fecha y Hora (java.time):
import java.time.Year;
public class AnioBisiestoMetodo {
public static void main(String[] args) {
int year = 2025;
if (Year.of(year).isLeap()) {
System.out.println(year + " - es un año bisiesto");
} else {
System.out.println(year + " - no es un año bisiesto");
}
}
}La salida será:
2025 - no es un año bisiestoInvertir una Cadena de Texto
Supongamos que tenemos la tarea de escribir un programa que reciba una cadena introducida por el usuario y la invierta. Para que el usuario pueda introducir algo, necesitaremos la clase Scanner. Y para invertir la cadena, usamos el método reverse de la clase StringBuilder.
Código:
import java.util.Scanner;
public class InvertirCadena {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Introduce una cadena:");
String str = scanner.nextLine();
String reversedStr = new StringBuilder(str).reverse().toString();
System.out.println(reversedStr);
scanner.close();
}
}Probemos el programa. Si introducimos la palabra «hola», la salida será aloh.
Nota sobre scanner.close(): cerrar el objeto Scanner también cierra el flujo de entrada subyacente (System.in). En programas con múltiples lecturas, recomiendo crear una única instancia de Scanner y reutilizarla, o mantenerla abierta hasta el final del programa para evitar problemas con java.
Calculadora de Suma con Opción de Salida
Esta calculadora, después de sumar dos números y mostrar la respuesta, pregunta si debe finalizar el programa. Esta funcionalidad se puede implementar con un bucle do-while. Aquí está el código de dicha calculadora:
import java.util.Scanner;
public class CalculadoraSuma {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
do {
System.out.println("Introduce el primer número: ");
int number1 = scanner.nextInt();
System.out.println("Introduce el segundo número: ");
int number2 = scanner.nextInt();
System.out.printf("%d + %d = %d \n", number1, number2, number1 + number2);
System.out.println("Para salir, introduce 0. Para continuar, introduce cualquier otro número:");
n = scanner.nextInt();
} while (n != 0);
scanner.close();
}
}Ejemplo de ejecución del programa con finalización:
Introduce el primer número:
4
Introduce el segundo número:
2
4 + 2 = 6
Para salir, introduce 0. Para continuar, introduce cualquier otro número:
0
Proceso finalizado con código de salida 0Búsqueda de una Palabra en una Cadena
Para buscar una palabra en una cadena, el método indexOf es ideal. Devuelve la posición de la palabra como un número entero. Aquí hay un ejemplo simple de cómo se puede usar este método:
public class BuscarPalabra {
public static void main(String[] args) {
String str = "Java es un lenguaje de programación de propósito general.";
String word = "lenguaje";
int position = str.indexOf(word);
System.out.println("Cadena: " + str);
System.out.println("Palabra buscada: " + word);
if (position != -1) {
System.out.println("La palabra '" + word + "' se encontró en la posición " + position);
} else {
System.out.println("La palabra '" + word + "' no se encontró en la cadena");
}
}
}Salida en la consola:
Cadena: Java es un lenguaje de programación de propósito general.
Palabra buscada: lenguaje
La palabra 'lenguaje' se encontró en la posición 11Tabla de Multiplicar
Para mostrar la tabla de multiplicar (tabla pitagórica) en la consola, necesitaremos dos bucles for anidados:
public class TablaMultiplicar {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
System.out.printf("%d\t", i * j);
}
System.out.println();
}
}
}Un bucle se encarga de las filas y el otro de las columnas. Como resultado, aparecerá una tabla de 9×9 en la consola.

Ordenación de Números Enteros
Supongamos que tenemos una secuencia de números: 6, 2, 8, 1, 3, 9, 5, 4, 7
Y necesitamos ordenarlos. Esta es una de las tareas más comunes y existen muchos problemas resueltos de programación en lenguaje java sobre algoritmos de ordenamiento.
Ordenación Ascendente
En Java existe la clase Arrays para trabajar con arrays. Primero hay que importarla.
Ahora creamos un array y lo pasamos al método sort de la clase Arrays. Este método ordenará los números en orden ascendente:
El código completo se verá así:
import java.util.Arrays;
public class OrdenacionAscendente {
public static void main(String[] args) {
int[] array = {6, 2, 8, 1, 3, 9, 5, 4, 7};
Arrays.sort(array);
for (int number : array) {
System.out.print(number + " ");
}
}
}Salida en la consola:
1 2 3 4 5 6 7 8 9Ahora intentemos mostrar los números en orden descendente.
Ordenación Descendente
Para esto, necesitaremos otra importación: import java.util.Comparator;
Necesitaremos el método reverseOrder, pero antes de usarlo es necesario transformar nuestro array int en un array Integer (su clase envolvente):
Integer[] boxedArray = Arrays.stream(array).boxed().toArray(Integer[]::new);Ahora se puede realizar la ordenación:
Arrays.sort(boxedArray, Comparator.reverseOrder());Y en el último paso, imprimimos los números con un bucle for.
El código completo será así:
import java.util.Arrays;
import java.util.Comparator;
public class OrdenacionDescendente {
public static void main(String[] args) {
int[] array = {6, 2, 8, 1, 3, 9, 5, 4, 7};
Integer[] boxedArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
Arrays.sort(boxedArray, Comparator.reverseOrder());
for (int number : boxedArray) {
System.out.print(number + " ");
}
}
}Salida en la consola:
9 8 7 6 5 4 3 2 1Material Extra
¿Quieres más? Te recomiendo practicar con los siguientes libros:
- Sánchez González, Luis José(Autor)
- García Hernández, Enrique(Autor)
- Republic., Reinventors(Autor)
- Fernández Rodríguez, David(Autor)
Última actualización el 2025-11-10 / Enlaces de afiliados / Imágenes de la API para Afiliados

