Vad är en ArrayList?

En ArrayList i datorprogrammering är en datastruktur som beter sig som en datormatris men som också implementerar förmågan att dynamiskt växa storleken på matrisen efter behov. Till skillnad från en inbyggd matrisdatatyp, som inte kan ändras storlek under programkörning, kan ArrayList-strukturen växa och krympa storleken på matrisen som svar på tillägg eller radering av element. Den har en mycket gynnsam prestandaprofil, vilket möjliggör snabb slumpmässig åtkomst till datainsamlingen. Det finns dock två tillfällen där det är långsammare än vissa andra datastrukturer, nämligen tillägg och borttagning av element från mitten av arrayen. De flesta objektorienterade programmeringsspråk har någon typ av implementering av en sådan lista, även om de ibland kallas dynamiska arrayer.

Att använda en ArrayList ger ett program möjlighet att komma åt dataobjekt med ett indexnummer omedelbart istället för att behöva gå igenom en hel sekvens av data för att hitta en adress, vilket krävs med länkade listor. Med möjligheten att öka storleken på arrayen efter behov, är det ett mycket balanserat tillvägagångssätt som tar hänsyn till både flexibilitet och hastighet. Dessutom, när element tas bort från en sådan lista, minskas storleken på arrayen, vilket frigör minnesutrymme.

En fördel med att använda en ArrayList framför vissa andra datastrukturer är att ett wrapperobjekt inte krävs för att innehålla data som lagras. I fallet med en länkad lista eller en hashtabell behövs vanligtvis ett separat objekt för att upprätthålla tekniken som används för att hålla och manipulera samlingen. Med en ArrayList är den enda information som behövs om dataobjekten adressen till objektet i minnet. Detta innebär att det blir mindre minnesanvändning när man arbetar med den här typen av listor.

Ett potentiellt problem med att använda en ArrayList kan komma från implementeringen och minneshanteringssystemet. De flesta arrayer är tilldelade som konsekutiva minnesplatser. Så för att använda en ArrayList av en viss storlek måste åtminstone så mycket minne vara tillgängligt i en oavbruten sekvens av block. Den dynamiska arrayen kan ändra storlek på sig själv flera gånger, så minnesfragmentering kan uppstå och leda till ett minnesallokeringsfel, vilket stoppar programexekveringen.

Prestandan för en ArrayList liknar den för att använda en standardmatris, även om åtkomsttiderna är något långsammare eftersom matrisen är inkapslad i ett objekt. Ett fall där en dynamisk array kan sakta ner dramatiskt, beroende på implementering, är när storleken på arrayen behöver ändras. Detta kan innebära att den aktuella arrayen kopieras till en ny array som tilldelats den nya önskade storleken, vilket orsakar en tillfällig försämring av prestanda. Samma problem kan uppstå när man lägger till eller tar bort ett element från mitten av listan, vilket gör att alla följande element måste flyttas till en ny plats.