1. Hoe ArrayList
is gestructureerd
ArrayList
is de Java-klasse die het meest wordt gebruikt voor het opslaan van elementen. Dus hoe ArrayList
werkt het en waarom vindt iedereen het zo leuk?
De structuur van ArrayList
is eenvoudig en ingenieus. Elk ArrayList
object bevat twee velden:
- Een reeks elementen
- Een
size
variabele die het aantal elementen in de lijst opslaat
Intern ArrayList
bevat een object een heel gewone array! Maar dat is niet alles. Er is ook een groottevariabele , die de lengte van de lijst opslaat. Dit is hoe het werkt:
Aanvankelijk is de lengte van de array in de lijst 10. En de size
variabele is 0.
Als u een element aan de lijst toevoegt, wordt het opgeslagen in de 0e cel van de array en size
wordt het verhoogd naar 1.
Als u nog een element toevoegt, wordt het opgeslagen in de 1e cel en size
wordt het opnieuw met 1 verhoogd en gelijk aan twee.
Als je een ander element toevoegt wanneer er geen ruimte meer is in de array, dan gebeurt het volgende in de add()
methode:
- Er wordt een nieuwe array gemaakt die anderhalf keer zo lang is als de vorige
- Alle elementen van de oude array worden naar de nieuwe array gekopieerd.
- In het
ArrayList
object vervangt een verwijzing naar de nieuwe array de verwijzing naar de oude . - Het doorgegeven element wordt opgeslagen in de 10e cel van de nieuwe array.
- De groottevariabele neemt met 1 toe en is nu gelijk aan 11
Iets soortgelijks gebeurt bij het toevoegen (invoegen) van een element in het midden van de lijst. De bestaande elementen worden 1 naar rechts verschoven en het doorgegeven element wordt naar de nieuw vrijgekomen cel van de array geschreven.
Nu bekijken we de meest elementaire scenario's met lijsten:
2. Een element toevoegen aan eenArrayList
Laten we eens kijken wat er in de lijst gebeurt wanneer er elementen aan worden toegevoegd. Onmiddellijk nadat een ArrayList-object is gemaakt, hebben we zoiets in het geheugen:
We hebben een ArrayList
object dat twee velden (twee variabelen) bevat: een container (de data
array) en het aantal opgeslagen elementen ( size
). De data
variabele slaat een verwijzing op naar een container (array) die 10 elementen kan opslaan.
Als we besluiten om het getal 5 aan de array toe te voegen, krijgen we het volgende beeld:
De array slaat nu het element 5 en size == 1
.
size()
Als iemand nu de methode op ons object aanroept ArrayList
, is de geretourneerde waarde het aantal elementen dat in de lijst is opgeslagen: 1. Het aantal elementen in de lijst is niet hetzelfde als de opslagcapaciteit van de array.
Noch de huidige opslagcapaciteit, noch de array zelf zal ooit toegankelijk (zichtbaar) zijn buiten het ArrayList
object. Dit zijn en blijven de ArrayList
interne gegevens van de 's'.
Laten we nog 7 getallen aan de lijst toevoegen: 10, 20, 30, 40, 50, 60, 70.
Het geheugen ziet er nu zo uit:
Als u de size()
methode nu aanroept, retourneert deze het getal 8, het nieuwe aantal elementen in de lijst. Deze waarde heeft niets te maken met de grootte van de interne array.
Er is één oversimplificatie in deze afbeelding.
De ArrayList
klasse kan geen primitieve typen opslaan, dus gebruikt deze het Integer
type in plaats van int
. De container slaat niet direct de waarden {5, 10, 20, 30, 40, 50, 60, 70} op, maar verwijzingen naar Integer
objecten. Alle lege cellen in de containeropslag null
.
3. De lengte van een lijst vergroten
Laten we eens kijken wat er in een lijst gebeurt als er geen lege cellen meer in de interne array zijn.
Stel dat we een lijst van 10 elementen hebben:
We besluiten er het getal 100 aan toe te voegen . Dit is wat er gebeurt in de add()
methode:
Stap 1 — Maak een nieuwe array aan:
Stap 2 — Kopieer alle elementen van de oude array naar de nieuwe:
Stap 3 — Vervang de oude array (wijzig de verwijzing naar de ArrayList
interne array van het object):
Stap 4 — Voeg het nieuwe nummer toe, waar we zo hard voor hebben gewerkt: