1. Hvordan ArrayLister strukturert

ArrayLister Java-klassen som oftest brukes til å lagre elementer. Så hvordan fungerer ArrayListdet og hvorfor liker alle det så godt?

Strukturen til ArrayLister enkel og genial. Hvert ArrayListobjekt inneholder to felt:

  • En rekke elementer
  • En sizevariabel som lagrer antall elementer i listen

Internt ArrayListinneholder et objekt en høyst ordinær matrise! Men det er ikke alt. Det er også en størrelsesvariabel , som lagrer lengden på listen. Slik fungerer det:

Til å begynne med er lengden på matrisen inne i listen 10. Og variabelen sizeer 0.

Hvis du legger til et element i listen, vil det bli lagret i den 0. cellen i matrisen, og sizevil øke til 1.

Hvis du legger til ett element til, vil det bli lagret i 1. celle, og sizevil igjen øke med 1 og bli lik to.

Hvis du legger til et annet element når det ikke er mer plass i matrisen, skjer følgende i metoden add():

  1. En ny matrise opprettes som er halvannen ganger lengden av den forrige
  2. Alle elementene i den gamle matrisen kopieres til den nye matrisen.
  3. I ArrayListobjektet erstatter en referanse til den nye matrisen referansen til den gamle .
  4. Det beståtte elementet lagres i den 10. cellen i den nye matrisen.
  5. Størrelsesvariabelen øker med 1 og vil nå være lik 11

Noe lignende skjer når du legger til (sett inn) et element i midten av listen. De eksisterende elementene forskyves med 1 til høyre, og det beståtte elementet skrives til den nylig frigjorte cellen i matrisen.

Nå skal vi vurdere de mest grunnleggende scenariene som involverer lister:


2. Legge til et element i enArrayList

La oss ta en titt på hva som skjer inne i listen når elementer legges til den. Umiddelbart etter at et ArrayList-objekt er opprettet, har vi noe slikt i minnet:

Legge til et element i en ArrayList

Vi har et ArrayListobjekt som inneholder to felt (to variabler): en beholder (matrisen data) og antall lagrede elementer ( size). Variabelen datalagrer en referanse til en beholder (array) som kan lagre 10 elementer.

Hvis vi bestemmer oss for å legge til tallet 5 til matrisen, får vi følgende bilde:

Legge til et element i en ArrayList 2

Matrisen lagrer nå element 5, og size == 1.

Hvis noen kaller size()metoden på ArrayListobjektet vårt nå, vil returverdien være antall elementer som er lagret i listen: 1. Antall elementer i listen er ikke det samme som lagringskapasiteten til matrisen.

Verken den nåværende lagringskapasiteten eller selve matrisen vil noen gang være tilgjengelig (synlig) utenfor objektet ArrayList. Dette er og vil alltid være ArrayLists interne data.

La oss legge til 7 flere tall til listen: 10, 20, 30, 40, 50, 60, 70.

Nå vil minnet se slik ut:

Legge til et element i en ArrayList

Hvis du kaller size()metoden nå, vil den returnere tallet 8, som er det nye antallet elementer i listen. Denne verdien har ingenting å gjøre med størrelsen på den interne matrisen.

Viktig:

Det er én overforenkling i dette bildet.

Klassen ArrayListkan ikke lagre primitive typer, så den bruker Integertypen i stedet for int. Beholderen lagrer ikke direkte verdiene {5, 10, 20, 30, 40, 50, 60, 70}, men referanser til Integerobjekter. Alle de tomme cellene i containerlageret null.



3. Øke lengden på en liste

La oss ta en titt på hva som skjer inne i en liste når det ikke er flere tomme celler i den interne matrisen.

Anta at vi har en liste med 10 elementer:

Øke lengden på en liste

Vi bestemmer oss for å legge til tallet 100 . Dette er hva som skjer i add()metoden:

Trinn 1 — Opprett en ny matrise:

Øke lengden på en liste 2

Trinn 2 — Kopier alle elementer fra den gamle matrisen til den nye:

Øke lengden på en liste 2

Trinn 3 — Erstatt den gamle matrisen (endre referansen til objektets ArrayListinterne matrise):

Øke lengden på en liste 3

Trinn 4 — Legg til det nye nummeret, som er det vi har jobbet så hardt for å oppnå:

Øke lengden på en liste 4