Algoritmos y estructuras de datos en Java: guía práctica
\n\nDominar los algoritmos y las estructuras de datos es una etapa clave en la formación de un desarrollador Java. No es solo teoría: comprender cómo funcionan las listas, las tablas hash y los algoritmos de ordenamiento afecta directamente el rendimiento y la escalabilidad de tu código. En este artículo, analizaremos las principales estructuras de datos y algoritmos en Java con ejemplos prácticos que te ayudarán a escribir programas más eficientes.
\n\n1. Arreglos dinámicos: ArrayList
\n\nArrayList es una implementación de arreglo dinámico en Java. A diferencia de un arreglo normal, su tamaño aumenta automáticamente al agregar nuevos elementos. Es una de las estructuras de datos más utilizadas.
Operaciones básicas
\n- \n
- Agregar elemento:
add(element)— O(1) en promedio, O(n) al expandir el arreglo. \n - Obtener elemento por índice:
get(index)— O(1). \n - Eliminar elemento:
remove(index)— O(n), ya que requiere desplazar elementos. \n
import java.util.ArrayList;\n\npublic class ArrayListExample {\n public static void main(String[] args) {\n ArrayList<Integer> numbers = new ArrayList<>();\n \n numbers.add(10);\n numbers.add(20);\n numbers.add(30);\n \n System.out.println("Elemento en el índice 1: " + numbers.get(1)); // 20\n \n numbers.remove(0); // Eliminamos el primer elemento\n System.out.println("Tamaño después de eliminar: " + numbers.size()); // 2\n }\n}\n\n\nCuándo usarlo: Cuando necesitas acceso rápido por índice y agregas elementos con frecuencia al final de la lista.
\n\n2. Tablas hash: HashMap
\n\nHashMap es una estructura de datos que almacena pares "clave-valor". Utiliza una función hash para una búsqueda rápida. En Java, HashMap es una de las colecciones más eficientes para operaciones de búsqueda, inserción y eliminación.
¿Cómo funciona?
\nCada clave se convierte en un código hash, que determina el "cubo" (bucket) donde se almacenará el valor. En caso de colisiones (cuando diferentes claves producen el mismo hash), se utiliza una lista enlazada o un árbol rojo-negro (desde Java 8).
\n\nEjemplo de uso
\n\nimport java.util.HashMap;\n\npublic class HashMapExample {\n public static void main(String[] args) {\n HashMap<String, Integer> studentGrades = new HashMap<>();\n \n studentGrades.put("Alice", 90);\n studentGrades.put("Bob", 85);\n studentGrades.put("Charlie", 92);\n \n // Búsqueda de calificación\n int aliceGrade = studentGrades.get("Alice");\n System.out.println("Calificación de Alice: " + aliceGrade); // 90\n \n // Verificar si existe una clave\n if (studentGrades.containsKey("David")) {\n System.out.println("David está en la lista");\n } else {\n System.out.println("David no encontrado");\n }\n \n // Recorrer todas las entradas\n for (String name : studentGrades.keySet()) {\n System.out.println(name + ": " + studentGrades.get(name));\n }\n }\n}\n\n\nComplejidad de las operaciones: En promedio O(1) para inserción, búsqueda y eliminación. En el peor caso (con muchas colisiones) — O(n).
\n\n3. Algoritmos de ordenamiento en Java
\n\nEl ordenamiento es una de las operaciones básicas. Java proporciona métodos integrados, pero comprender su funcionamiento interno es fundamental para escribir código eficiente.
\n\nOrdenamiento rápido (QuickSort)
\n\nEs uno de los algoritmos de ordenamiento más rápidos. Funciona según el principio de "divide y vencerás": selecciona un elemento pivote y divide el arreglo en dos partes — menores y mayores que el pivote.
\n\npublic class QuickSort {\n public static v