1. Hvordan ArrayList
er opbygget
ArrayList
er den Java-klasse, der oftest bruges til lagring af elementer. Så hvordan fungerer ArrayList
det, og hvorfor kan alle lide det så meget?
Strukturen af ArrayList
er enkel og genial. Hvert ArrayList
objekt indeholder to felter:
- En række elementer
- En
size
variabel, som gemmer antallet af elementer på listen
Internt ArrayList
indeholder et objekt et meget almindeligt array! Men det er ikke alt. Der er også en størrelsesvariabel , som gemmer listens længde. Sådan fungerer det:
Til at begynde med er længden af arrayet inde i listen 10. Og variablen size
er 0.
Hvis du tilføjer et element til listen, vil det blive gemt i den 0. celle i arrayet og size
vil øges til 1.
Tilføjer du et element mere, vil det blive gemt i 1. celle, og size
vil igen stige med 1 og blive lig med to.
Hvis du tilføjer et andet element, når der ikke er mere plads i arrayet, sker der følgende i metoden add()
:
- Der oprettes et nyt array , der er halvanden gange længden af det forrige
- Alle elementerne i det gamle array kopieres til det nye array.
- I
ArrayList
objektet erstatter en reference til det nye array referencen til det gamle . - Det beståede element gemmes i den 10. celle i det nye array.
- Størrelsesvariablen øges med 1 og vil nu være lig med 11
Noget lignende sker, når man tilføjer (indsætter) et element i midten af listen. De eksisterende elementer flyttes med 1 til højre, og det beståede element skrives til den netop frigivne celle i arrayet.
Nu vil vi overveje de mest grundlæggende scenarier, der involverer lister:
2. Tilføjelse af et element til enArrayList
Lad os tage et kig på, hvad der sker inde i listen, når elementer føjes til den. Umiddelbart efter et ArrayList-objekt er oprettet, har vi noget som dette i hukommelsen:
Vi har et ArrayList
objekt, der indeholder to felter (to variable): en container (arrayet data
) og antallet af lagrede elementer ( size
). Variablen data
gemmer en reference til en container (array), der kan lagre 10 elementer.
Hvis vi beslutter os for at tilføje tallet 5 til arrayet, får vi følgende billede:
Arrayet gemmer nu elementet 5 og size == 1
.
Hvis nogen kalder size()
metoden på vores ArrayList
objekt nu, vil returværdien være antallet af elementer gemt i listen: 1. Antallet af elementer i listen er ikke det samme som arrayets lagerkapacitet.
Hverken den aktuelle lagerkapacitet eller selve arrayet vil nogensinde være tilgængelig (synlig) uden for objektet ArrayList
. Dette er og vil altid være ArrayList
's interne data.
Lad os tilføje 7 flere numre til listen: 10, 20, 30, 40, 50, 60, 70.
Nu vil hukommelsen se sådan ud:
Hvis du kalder size()
metoden nu, vil den returnere tallet 8, som er det nye antal elementer på listen. Denne værdi har intet at gøre med størrelsen af det interne array.
Der er en overforenkling i dette billede.
Klassen ArrayList
kan ikke gemme primitive typer, så den bruger Integer
typen i stedet for int
. Containeren gemmer ikke direkte værdierne {5, 10, 20, 30, 40, 50, 60, 70}, men derimod referencer til Integer
objekter. Alle de tomme celler i containerlageret null
.
3. Forøgelse af længden af en liste
Lad os tage et kig på, hvad der sker inde i en liste, når der ikke er flere tomme celler i dens interne array.
Antag, at vi har en liste med 10 elementer:
Vi beslutter at tilføje tallet 100 til det. Dette er hvad der sker i add()
metoden:
Trin 1 — Opret et nyt array:
Trin 2 — Kopier alle elementer fra det gamle array til det nye:
Trin 3 — Erstat det gamle array (ændre referencen til objektets ArrayList
interne array):
Trin 4 — Tilføj det nye nummer, som er, hvad vi har arbejdet så hårdt for at opnå:
GO TO FULL VERSION