1. Hur ArrayList
är uppbyggt
ArrayList
är den Java-klass som används oftast för att lagra element. Så hur fungerar ArrayList
det och varför gillar alla det så mycket?
Strukturen på ArrayList
är enkel och genialisk. Varje ArrayList
objekt innehåller två fält:
- En rad element
- En
size
variabel som lagrar antalet element i listan
Internt ArrayList
innehå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 size
kommer att öka till 1.
Om du lägger till ytterligare ett element kommer det att lagras i den första cellen och size
kommer å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()
:
- En ny array skapas som är en och en halv gånger så lång som den föregående
- Alla element i den gamla arrayen kopieras till den nya arrayen.
- I
ArrayList
objektet ersätter en referens till den nya arrayen referensen till den gamla . - Det godkända elementet sparas i den tionde cellen i den nya arrayen.
- 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:
Vi har ett ArrayList
objekt som innehåller två fält (två variabler): en behållare (matrisen) data
och antalet lagrade element ( size
). Variabeln data
lagrar 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:
Arrayen lagrar nu elementet 5 och size == 1
.
Om någon anropar size()
metoden på vårt ArrayList
objekt 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 ArrayList
interna 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:
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.
Det finns en överförenkling i den här bilden.
Klassen ArrayList
kan inte lagra primitiva typer, så den använder Integer
typen snarare än int
. Behållaren lagrar inte direkt värdena {5, 10, 20, 30, 40, 50, 60, 70}, utan snarare referenser till Integer
objekt. 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:
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:
Steg 2 — Kopiera alla element från den gamla arrayen till den nya:
Steg 3 — Byt ut den gamla arrayen (ändra referensen till objektets ArrayList
interna array):
Steg 4 — Lägg till det nya numret, vilket är vad vi har arbetat så hårt för att åstadkomma:
GO TO FULL VERSION