En Java, las colecciones implementan estructuras de datos para trabajar con grupos de objetos. Las estructuras principales son:
ArrayList (implementa la interfaz List) almacena elementos en un arreglo, proporciona acceso rápido por índice, pero la inserción/eliminación de elementos en medio es lenta, ya que implica el desplazamiento de elementos.
LinkedList (también implementa List) está construida sobre una lista doblemente enlazada. Inserta/elimina elementos rápidamente en medio, pero el acceso por índice es lento, ya que debe recorrer la lista desde el principio o el final.
HashMap implementa la interfaz Map. Almacena pares clave-valor. El acceso rápido (O(1)) a los valores por clave se garantiza mediante una función hash, pero no garantiza el orden de los elementos.
List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // rápido arrayList.get(0); // rápido List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // un poco más lento linkedList.add(0, "B"); // rápido Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // rápido
¿Cuál es la diferencia fundamental entre HashMap y Hashtable, y por qué Hashtable prácticamente no se utiliza en el código moderno?
Respuesta: HashMap no está sincronizado, permite null tanto como clave como valor. Hashtable está sincronizado (varios hilos pueden trabajar con un mismo objeto sin comprometer la integridad), pero no permite null y es más lento. En el código moderno, se utiliza más frecuentemente ConcurrentHashMap para la seguridad de hilo, ya que es más eficiente y se configura de manera más delgada para cálculos multihilo.
Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException
Historia
En un sistema de seguimiento de estudiantes, se utilizó ArrayList para inserciones y eliminaciones frecuentes en medio de la lista, lo que llevó a una fuerte degradación del rendimiento con grandes volúmenes de datos. Después de cambiar a LinkedList, la situación se normalizó.
Historia
En un sistema CRM multihilo, se utilizó HashMap para almacenar datos entre hilos sin sincronización, lo que ocasionalmente resultó en datos inconsistentes y caídas debido a condiciones de carrera. Después de cambiar a ConcurrentHashMap, el error desapareció.
Historia
Un desarrollador intentó agregar una clave null en Hashtable, sin saber de la prohibición. Esto provocó un NullPointerException, y pasaron mucho tiempo tratando de encontrar por qué la aplicación se caía inesperadamente.