Guía Java Collections
Guía Java Collections
--------------------------------------------------------------------
En Java, la interfaz List es una de las estructuras de datos más fundamentales y se
utiliza para almacenar secuencias de elementos. Los objetos que implementan la
interfaz List pueden contener elementos duplicados y son capaces de mantener un
orden de inserción. Aquí están los tres tipos más comunes de implementaciones de
List en Java:
### 1. ArrayList
ArrayList es una implementación de la interfaz List que usa un array dinámico para
almacenar los elementos. Es la implementación más común debido a su eficiencia
general en la mayoría de escenarios. ArrayList proporciona acceso aleatorio rápido
a sus elementos, lo que significa que puedes obtener cualquier elemento en tiempo
constante. Sin embargo, la inserción y eliminación de elementos (especialmente en
el medio de la lista) puede ser más lenta comparada con otras implementaciones,
debido a la necesidad de ajustar todos los elementos posteriores.
*Ejemplo:*
java
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
arrayList.add("Cherry");
System.out.println(arrayList); // Salida: [Apple, Banana, Cherry]
### 2. LinkedList
LinkedList implementa tanto la interfaz List como Deque. Utiliza una lista
doblemente enlazada internamente para almacenar sus elementos. Esto hace que la
inserción y eliminación de elementos en cualquier parte de la lista sea muy
eficiente (tiempo constante), especialmente útil para aplicaciones que requieren
muchas operaciones de este tipo. Sin embargo, el acceso aleatorio a elementos en
una LinkedList es más lento comparado con ArrayList, porque los elementos deben ser
accedidos secuencialmente desde el inicio o el fin de la lista.
*Ejemplo:*
java
List<String> linkedList = new LinkedList<>();
linkedList.add("Apple");
linkedList.add("Banana");
linkedList.add("Cherry");
System.out.println(linkedList); // Salida: [Apple, Banana, Cherry]
### 3. Vector
Vector es similar a ArrayList, pero con la diferencia de que es sincronizado. Esto
significa que Vector es seguro para usar en un entorno multihilo sin necesidad de
sincronización externa. Sin embargo, debido a su naturaleza sincronizada, Vector
puede ser menos eficiente en términos de rendimiento en comparación con ArrayList
cuando se usa en aplicaciones de un solo hilo. Vector también incluye algunos
métodos que no son parte de la interfaz List, como addElement, removeElement, y
elementAt.
*Ejemplo:*
java
List<String> vector = new Vector<>();
vector.add("Apple");
vector.add("Banana");
vector.add("Cherry");
System.out.println(vector); // Salida: [Apple, Banana, Cherry]
-----------------------------------------------------------
### 1. HashMap
HashMap es la implementación más común de la interfaz Map que usa una tabla hash.
No garantiza ningún orden en la iteración de sus elementos. Es la más eficiente en
términos de velocidad de acceso y inserción, ideal para situaciones donde el orden
no importa.
**Ejemplo de HashMap:**
java
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("manzana", 40);
hashMap.put("banana", 10);
hashMap.put("cereza", 20);
System.out.println(hashMap);
// Salida podría ser en cualquier orden, como {banana=10, cereza=20, manzana=40}
### 2. TreeMap
TreeMap implementa Map y almacena sus elementos en un árbol rojo-negro, lo que
significa que están ordenados según el orden natural de sus claves, o por un
Comparator proporcionado en el momento de creación del mapa. TreeMap es útil cuando
necesitas un orden constante en los elementos.
**Ejemplo de TreeMap:**
java
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("manzana", 40);
treeMap.put("banana", 10);
treeMap.put("cereza", 20);
System.out.println(treeMap);
// Salida será en orden alfabético de las claves: {banana=10, cereza=20,
manzana=40}
### 3. LinkedHashMap
LinkedHashMap es similar a HashMap con la diferencia adicional de que mantiene una
lista de las entradas en el orden en que fueron insertadas, lo que lo hace
ligeramente menos eficiente que HashMap pero útil cuando se necesita preservar el
orden de inserción.
**Ejemplo de LinkedHashMap:**
java
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("manzana", 40);
linkedHashMap.put("banana", 10);
linkedHashMap.put("cereza", 20);
System.out.println(linkedHashMap);
// Salida será en el orden en que se insertaron los elementos: {manzana=40,
banana=10, cereza=20}
### Resumen
- *HashMap*: No mantiene ningún orden de las claves o entradas.
- *TreeMap*: Ordena las claves según el orden natural o un comparador.
- *LinkedHashMap*: Mantiene el orden de inserción de las entradas.
Estas características hacen que cada tipo de mapa sea útil para diferentes
situaciones dependiendo de tus necesidades específicas relacionadas con el
ordenamiento y la eficiencia del acceso.
------------------------------------
Los hilos en Java, conocidos como threads, son flujos de control independientes
dentro del programa principal. Permiten que múltiples tareas se ejecuten
concurrentemente dentro de un solo proceso. Utilizar hilos puede hacer que tu
aplicación sea más eficiente al realizar varias operaciones al mismo tiempo,
especialmente en tareas que involucran esperas, como operaciones de entrada/salida
o conexiones de red.
Java proporciona varias maneras de crear y manejar hilos, siendo las más comunes:
java
public class MiThread extends Thread {
public void run() {
System.out.println("El hilo está corriendo.");
}
java
public class MiRunnable implements Runnable {
public void run() {
System.out.println("El hilo está corriendo.");
}
Imagina que quieres imprimir números del 1 al 5, pero esperando un segundo entre
cada número. Puedes hacer esto en un hilo separado para no bloquear el hilo
principal de tu aplicación:
java
public class Contador extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
try {
Thread.sleep(1000); // Dormir por un segundo
System.out.println(i);
} catch (InterruptedException e) {
System.out.println("El hilo fue interrumpido");
}
}
}
En este ejemplo, Thread.sleep(1000) pausa el hilo actual por 1000 milisegundos (un
segundo), lo que permite simular un retraso sin bloquear otros hilos que podrían
estar ejecutando otras tareas.