1. Hur ArrayListär uppbyggt

ArrayListär den Java-klass som används oftast för att lagra element. Så hur fungerar ArrayListdet och varför gillar alla det så mycket?

Strukturen på ArrayListär enkel och genialisk. Varje ArrayListobjekt innehåller två fält:

  • En rad element
  • En sizevariabel som lagrar antalet element i listan

Internt ArrayListinnehåller ett objekt en högst ordinär array! Men det är inte allt. Det finns också en storleksvariabel som lagrar längden på listan. Så här fungerar det:

Inledningsvis är längden på arrayen i listan 10. Och variabeln sizeär 0.

Om du lägger till ett element i listan, kommer det att lagras i den 0:e cellen i arrayen och sizekommer att öka till 1.

Om du lägger till ytterligare ett element kommer det att lagras i den första cellen och sizekommer återigen att öka med 1 och bli lika med två.

Om du lägger till ytterligare ett element när det inte finns mer utrymme i arrayen, händer följande i metoden add():

  1. En ny array skapas som är en och en halv gånger så lång som den föregående
  2. Alla element i den gamla arrayen kopieras till den nya arrayen.
  3. I ArrayListobjektet ersätter en referens till den nya arrayen referensen till den gamla .
  4. Det godkända elementet sparas i den tionde cellen i den nya arrayen.
  5. Storleksvariabeln ökar med 1 och blir nu lika med 11

Något liknande händer när man lägger till (infogar) ett element i mitten av listan. De befintliga elementen flyttas med 1 åt höger, och det skickade elementet skrivs till den nyligen frigjorda cellen i arrayen.

Nu ska vi överväga de mest grundläggande scenarierna som involverar listor:


2. Lägga till ett element till enArrayList

Låt oss ta en titt på vad som händer i listan när element läggs till i den. Omedelbart efter att ett ArrayList-objekt har skapats har vi något sånt här i minnet:

Lägga till ett element i en ArrayList

Vi har ett ArrayListobjekt som innehåller två fält (två variabler): en behållare (matrisen) dataoch antalet lagrade element ( size). Variabeln datalagrar en referens till en behållare (array) som kan lagra 10 element.

Om vi ​​bestämmer oss för att lägga till siffran 5 till arrayen får vi följande bild:

Lägga till ett element i en ArrayList 2

Arrayen lagrar nu elementet 5 och size == 1.

Om någon anropar size()metoden på vårt ArrayListobjekt nu, kommer returvärdet att vara antalet element lagrade i listan: 1. Antalet element i listan är inte detsamma som lagringskapaciteten för arrayen.

Varken den nuvarande lagringskapaciteten eller själva arrayen kommer någonsin att vara tillgänglig (synlig) utanför objektet ArrayList. Detta är och kommer alltid att vara s ArrayListinterna data.

Låt oss lägga till ytterligare 7 nummer till listan: 10, 20, 30, 40, 50, 60, 70.

Nu kommer minnet att se ut så här:

Lägga till ett element i en ArrayList

Om du anropar size()metoden nu kommer den att returnera talet 8, vilket är det nya antalet element i listan. Detta värde har ingenting att göra med storleken på den interna arrayen.

Viktig:

Det finns en överförenkling i den här bilden.

Klassen ArrayListkan inte lagra primitiva typer, så den använder Integertypen snarare än int. Behållaren lagrar inte direkt värdena {5, 10, 20, 30, 40, 50, 60, 70}, utan snarare referenser till Integerobjekt. Alla tomma celler i containerförrådet null.



3. Öka längden på en lista

Låt oss ta en titt på vad som händer i en lista när det inte finns fler tomma celler i dess interna array.

Anta att vi har en lista med 10 element:

Öka längden på en lista

Vi bestämmer oss för att lägga till siffran 100 . Detta är vad som händer i add()metoden:

Steg 1 — Skapa en ny array:

Öka längden på en lista 2

Steg 2 — Kopiera alla element från den gamla arrayen till den nya:

Öka längden på en lista 2

Steg 3 — Byt ut den gamla arrayen (ändra referensen till objektets ArrayListinterna array):

Öka längden på en lista 3

Steg 4 — Lägg till det nya numret, vilket är vad vi har arbetat så hårt för att åstadkomma:

Öka längden på en lista 4