Java Collection Tutorial

March 11

Un errore comune fatto da nuovi programmatori è quello di memorizzare tutte le collezioni di dati in array semplici. Mentre la matrice di base è una grande struttura di dati, ha un certo numero di punti deboli che può essere evitato utilizzando alcune delle altre strutture di dati di base. Il framework Java Collections fornisce un insieme di interfacce di facile utilizzo e le classi che implementano alcune delle strutture dati più comuni in informatica.

Array di base

La cosa migliore di una matrice di base in Java è che si può leggere da e scritti in fretta. Tuttavia, aggiungendo o rimuovendo permanentemente un elemento della matrice richiede una grande quantità di tempo, perché Java non supporta matrici dinamiche. Ogni volta che si ridimensiona un array in Java, è necessario ricostruire l'array di nuovo da zero, un elemento alla volta, con un ciclo. È possibile evitare questo inizializzando sempre gli array alla dimensione massima richiesta in qualsiasi momento durante l'esecuzione, ma che può essere uno spreco drammatico di memoria ed è solo cattiva progettazione in generale.

Lista di array

La classe ArrayList dalla libreria java.util affronta alcuni di questi problemi avvolgendo un insieme di funzioni del gestore circa una matrice nascosta. Questa matrice è strategicamente aumentata e diminuita in dimensioni periodicamente in modo che, in media, l'aggiunta e rimozione di elementi avviene molto rapidamente. Ma a volte, il nascosto, matrice interna deve essere semplicemente ridimensionata, e in tali casi, l'operazione richiederà una maggiore quantità di tempo.

Lista collegata

Il LinkedList va oltre l'ArrayList e in realtà non ha alcuna matrice di sorta, nascoste o meno. Invece, i record sono margherita concatenati in nodi, ogni nodo contenente un riferimento all'indirizzo di memoria della prossima. Il vantaggio di una LinkedList è che l'aggiunta o la rimozione di nuovi pezzi di dati avviene sempre molto rapidamente tempo e non è mai eventuale ridimensionamento di un array da eseguire. Tuttavia, è impossibile accedere ai dati nel mezzo della lista senza passare attraverso l'intero elenco dalla parte anteriore o posteriore, in modo che il tempo necessario per leggere i dati dal mezzo di una LinkedList può essere significativo.

Il ArrayList consente ai dati ovunque all'interno di esso per accedere molto rapidamente, e di solito in grado di ridimensionare rapidamente, ma a volte richiede più tempo quando la sua matrice interna ha bisogno di essere ricostruito. La LinkedList può sempre aggiungere e rimuovere i dati dalla lista molto rapidamente, ma il recupero dei dati a partire dalla metà della lista può richiedere molto tempo. Questo rende il LinkedList una buona scelta per stack e code che saranno accessibili solo nella parte anteriore o posteriore, ma il ArrayList una scelta migliore come un sostituto generale per la semplice array.

HashSet

Il HashSet, come sia il ArrayList e LinkedList, consente ai dati di essere aggiunti e rimossi molto, molto velocemente, e ha anche un altro vantaggio: un HashSet può essere cercata in modo estremamente rapido, più veloce di un array, ArrayLists o LinkedLists. Si fa eseguendo una operazione matematica su un pezzo di dati per determinare l'indice in una matrice, e quindi eseguendo la stessa operazione sui dati da ricercare per ottenere l'indice dei dati desiderati.

Se questo è fonte di confusione, non ti preoccupare. La cosa importante è che HashSets sono grandi per i set di dati che dovranno essere cercato attraverso più e più volte. Ma hanno anche una debolezza significativa: a hashset non mantiene l'ordine dei dati che viene inserito in esso, e l'ordinamento degli elementi dell'insieme possono cambiare da un momento all'altro. Ad esempio, in una matrice di base, se un elemento è posizionato in corrispondenza dell'indice 0, il programmatore può contare su di esso restante indice 0 forever finché non cambia. Ma in un HashSet, un elemento in corrispondenza dell'indice 0 in un dato momento potrebbe essere nella posizione di indice 327 nel momento successivo.