In Java, le collezioni implementano strutture dati per lavorare con gruppi di oggetti. Le principali strutture:
ArrayList (implementa l'interfaccia List) memorizza elementi in un array, garantisce accesso rapido per indice, ma l'inserimento/rimozione di elementi in mezzo è lento, poiché richiede lo spostamento degli elementi.
LinkedList (anch'essa implementa List) è costruita su una lista doppiamente collegata. Inserisce/rimuove rapidamente elementi in mezzo, ma l'accesso per indice è lento, poiché è necessario attraversare la lista dall'inizio o dalla fine.
HashMap implementa l'interfaccia Map. Memorizza coppie chiave-valore. L'accesso rapido (O(1)) ai valori tramite chiave è garantito da una funzione hash, ma non garantisce l'ordine degli elementi.
List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // veloce arrayList.get(0); // veloce List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // un po' più lento linkedList.add(0, "B"); // veloce Map<String, Integer> map = new HashMap<>(); map.put("uno", 1); Integer val = map.get("uno"); // veloce
Qual è la differenza principale tra HashMap e Hashtable, e perché Hashtable è praticamente inutilizzato nel codice moderno?
Risposta: HashMap non è sincronizzato, consente null sia come chiave che come valore. Hashtable è sincronizzato (più thread possono lavorare con lo stesso oggetto senza compromettere l'integrità), ma non consente null ed è più lento. Nel codice moderno si utilizza più spesso ConcurrentHashMap per la sicurezza nei thread, poiché è più efficiente e più facile da configurare per i calcoli multithread.
Map<String, String> map1 = new HashMap<>(); map1.put(null, "valore"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "valore"); // NullPointerException
Storia
Nel sistema di registrazione degli studenti è stato utilizzato ArrayList per frequenti inserimenti e rimozioni in mezzo alla lista, il che ha portato a una forte degradazione delle prestazioni con un grande volume di dati. Dopo la sostituzione con LinkedList la situazione si è normalizzata.
Storia
In un sistema CRM multithread era stato utilizzato HashMap per memorizzare dati tra thread senza sincronizzazione, il che portava periodicamente a dati incoerenti e arresti anomali a causa di race condition. Dopo il passaggio a ConcurrentHashMap il bug è scomparso.
Storia
Uno sviluppatore ha tentato di aggiungere una chiave null in Hashtable, senza sapere del divieto. Questo ha causato un NullPointerException, e ci sono voluti a lungo per capire perché l'applicazione si bloccava inaspettatamente.