De capaciteit van een ArrayList versus de grootte van een array in Java

1. Overzicht

Met Java kunnen we arrays met een vaste grootte maken of verzamelklassen gebruiken om een ​​vergelijkbare taak uit te voeren.

In deze tutorial gaan we kijken naar het verschil tussen de capaciteit van een ArrayList en de grootte van een array.

We zullen ook voorbeelden bekijken van wanneer we moeten initialiseren ArrayList met een capaciteit en de voor- en nadelen in termen van geheugengebruik.

2. Voorbeeld

Laten we eerst beide opties proberen om de verschillen te begrijpen.

2.1. Grootte van een array

In Java is het verplicht om de grootte van een array op te geven tijdens het maken van een nieuw exemplaar ervan:

Geheel getal [] array = nieuw geheel getal [100]; System.out.println ("Grootte van een array:" + array.length);

Hier hebben we een iknteger array van grootte 100, wat resulteerde in de onderstaande uitvoer

Grootte van een array: 100

2.2. Capaciteit van een ArrayList

Laten we nu een ArrayList met een startcapaciteit van 100:

Lijstlijst = nieuwe ArrayList (100); System.out.println ("Grootte van de lijst is:" + list.size ());
Grootte van de lijst is: 0

Omdat er nog geen elementen zijn toegevoegd, is de grootte nul.

Laten we nu een element aan de lijst toevoegen en de grootte ervan controleren:

lijst.add (10); System.out.println ("Grootte van de lijst is:" + list.size ());
Grootte van de lijst is: 1

3. Grootte in arrays vs. ArrayList

Hieronder staan ​​enkele grote verschillen tussen de grootte van een array en de capaciteit van een ArrayList.

3.1. Wijziging van grootte

Arrays hebben een vaste grootte. Zodra we de array met een aantal hebben geïnitialiseerd int waarde als zijn grootte, kan het niet veranderen. Ook de grootte en capaciteit zijn aan elkaar gelijk.

ArrayList‘S grootte en capaciteit staan ​​niet vast. De logische grootte van de lijst verandert op basis van het invoegen en verwijderen van elementen erin. Dit wordt apart beheerd van de fysieke opslaggrootte. Ook als de drempel van ArrayList capaciteit is bereikt, vergroot het zijn capaciteit om plaats te maken voor meer elementen.

3.2. Geheugentoewijzing

Het array-geheugen wordt toegewezen bij het maken. Wanneer we een array initialiseren, wijst het het geheugen toe op basis van de grootte en het type van een array. Het initialiseert alle elementen met een nul waarde voor referentietypes en de standaardwaarde voor primitieve typen.

ArrayList verandert de geheugentoewijzing naarmate het groeit. Wanneer we de capaciteit specificeren tijdens het initialiseren van het ArrayList, wijst het voldoende geheugen toe om objecten tot die capaciteit op te slaan. De logische grootte blijft 0. Wanneer het tijd is om de capaciteit uit te breiden, wordt een nieuwe, grotere array gemaakt en worden de waarden ernaar gekopieerd.

We moeten opmerken dat er een speciale array met een singleton-grootte van 0 is voor leeg ArrayList objecten, waardoor ze erg goedkoop zijn om te maken. Het is ook de moeite waard om dat op te merken ArrayList gebruikt intern een reeks objectreferenties.

4. Wanneer te initialiseren ArrayList met capaciteit

We mogen verwachten dat we de capaciteit van een ArrayList wanneer we de vereiste grootte weten voordat we het maken, maar dit is meestal niet nodig. Er zijn echter een paar redenen waarom dit de beste optie is.

4.1. Een groot bouwen ArrayList

Het is goed om een ​​lijst met een begincapaciteit te initialiseren als we weten dat deze groot zal worden. Dit voorkomt dure kweekoperaties als we elementen toevoegen.

Evenzo, als de lijst erg groot is, kunnen de automatische groei-bewerkingen meer geheugen toewijzen dan nodig is voor de exacte maximale grootte. Dit komt omdat de hoeveelheid die elke keer moet groeien, wordt berekend als een percentage van de grootte tot nu toe. Dus met grote lijsten kan dit resulteren in geheugenverspilling.

4.2. Klein meervoud bouwen ArrayLists

Hebben we veel kleine collecties, dan is de automatische capaciteit van een ArrayList kan een groot percentage verspild geheugen opleveren. Laten we dat zeggen ArrayList geeft de voorkeur aan een grootte van 10 met een kleiner aantal elementen, maar we slaan er slechts 2 of 3 op. Dat betekent 70% verspild geheugen, wat van belang kan zijn als we een groot aantal van deze lijsten hebben.

Het vooraf instellen van de capaciteit kan deze situatie voorkomen.

5. Afval vermijden

Dat moeten we opmerken ArrayList is een goede oplossing voor een container met objecten van flexibele grootte die willekeurige toegang moet ondersteunen. Het verbruikt iets meer geheugen dan een array, maar biedt een rijkere reeks bewerkingen.

In sommige gevallen, vooral bij grote verzamelingen primitieve waarden, kan de standaardarray sneller zijn en minder geheugen gebruiken.

Evenzo, voor het opslaan van een variabel aantal elementen die niet via index hoeven te worden benaderd, LinkedList kan performanter zijn. Het brengt geen overhead van geheugenbeheer met zich mee.

6. Samenvatting

In dit korte artikel zagen we het verschil tussen de capaciteit van de ArrayList en de grootte van een array. We hebben ook gekeken wanneer we het ArrayList met capaciteit en de voordelen ervan met betrekking tot geheugengebruik en prestaties.

Zoals altijd is de voorbeeldcode beschikbaar op GitHub.