ProgrammazioneSviluppatore Backend

Come funzionano le collezioni in Java? Quali sono le differenze tra ArrayList, LinkedList e HashMap?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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

Domanda trabocchetto.

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

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento.


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.