1. Hvordan ArrayLister opbygget

ArrayLister den Java-klasse, der oftest bruges til lagring af elementer. Så hvordan fungerer ArrayListdet, og hvorfor kan alle lide det så meget?

Strukturen af ArrayList​​er enkel og genial. Hvert ArrayListobjekt indeholder to felter:

  • En række elementer
  • En sizevariabel, som gemmer antallet af elementer på listen

Internt ArrayListindeholder 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 sizeer 0.

Hvis du tilføjer et element til listen, vil det blive gemt i den 0. celle i arrayet og sizevil øges til 1.

Tilføjer du et element mere, vil det blive gemt i 1. celle, og sizevil 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():

  1. Der oprettes et nyt array , der er halvanden gange længden af ​​det forrige
  2. Alle elementerne i det gamle array kopieres til det nye array.
  3. I ArrayListobjektet erstatter en reference til det nye array referencen til det gamle .
  4. Det beståede element gemmes i den 10. celle i det nye array.
  5. 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:

Tilføjelse af et element til en ArrayList

Vi har et ArrayListobjekt, der indeholder to felter (to variable): en container (arrayet data) og antallet af lagrede elementer ( size). Variablen datagemmer 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:

Tilføjelse af et element til en ArrayList 2

Arrayet gemmer nu elementet 5 og size == 1.

Hvis nogen kalder size()metoden på vores ArrayListobjekt 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:

Tilføjelse af et element til en ArrayList

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.

Vigtig:

Der er en overforenkling i dette billede.

Klassen ArrayListkan ikke gemme primitive typer, så den bruger Integertypen i stedet for int. Containeren gemmer ikke direkte værdierne {5, 10, 20, 30, 40, 50, 60, 70}, men derimod referencer til Integerobjekter. 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:

Forøgelse af længden af ​​en liste

Vi beslutter at tilføje tallet 100 til det. Dette er hvad der sker i add()metoden:

Trin 1 — Opret et nyt array:

Forøgelse af længden af ​​en liste 2

Trin 2 — Kopier alle elementer fra det gamle array til det nye:

Forøgelse af længden af ​​en liste 2

Trin 3 — Erstat det gamle array (ændre referencen til objektets ArrayListinterne array):

Forøgelse af længden af ​​en liste 3

Trin 4 — Tilføj det nye nummer, som er, hvad vi har arbejdet så hårdt for at opnå:

Forøgelse af længden af ​​en liste 4