De lengte van een array verlengen

1. Overzicht

In deze tutorial bekijken we de verschillende manieren waarop we een Java-array kunnen uitbreiden.

Omdat arrays een aaneengesloten geheugenblok zijn, is het antwoord misschien niet meteen duidelijk, maar laten we dat nu uitpakken.

2. Met behulp van Arrays.copyOf

Laten we eerst eens kijken Arrays.copyOf. We kopiëren de array en voegen een nieuw element toe aan de kopie:

openbaar geheel getal [] addElementUsingArraysCopyOf (Geheel getal [] srcArray, int elementToAdd) {Geheel getal [] destArray = Arrays.copyOf (srcArray, srcArray.length + 1); destArray [destArray.length - 1] = elementToAdd; retourneer destArray; }

De weg Arrays.copyOf werkt is dat het duurt srcArray en kopieert het aantal elementen gespecificeerd in het lengte-argument naar een nieuwe array die het intern creëert. De grootte van de nieuwe array is het argument dat we geven.

Een ding om op te merken is dat wanneer het lengte-argument groter is dan de grootte van de bronarray, Arrays.copyOf zal de extra elementen in de doelmatrix vullen met nul.

Afhankelijk van het datatype zal het gedrag van de vulling verschillen. Als we bijvoorbeeld primitieve gegevenstypen gebruiken in plaats van Geheel getal dan worden de extra elementen gevuld met de nullen. In het geval van char, Arrays.copyOf zal extra elementen vullen met nul en in het geval van boolean, met false.

3. Met behulp van ArrayList

De volgende manier waarop we zullen kijken, is gebruiken ArrayList.

We gaan eerst converteer de array naar een ArrayListen voeg vervolgens het element toe. Dan zullen we converteer het ArrayList terug naar een array:

openbaar geheel getal [] addElementUsingArrayList (geheel getal [] srcArray, int elementToAdd) {geheel getal [] destArray = nieuw geheel getal [srcArray.length + 1]; ArrayList arrayList = nieuwe ArrayList (Arrays.asList (srcArray)); arrayList.add (elementToAdd); return arrayList.toArray (destArray); }

Merk op dat we de srcArray door het om te zetten in een Verzameling. De srcArray zullen vul de onderliggende array in het ArrayList.

Een ander ding om op te merken is dat we de bestemmingsarray als argument hebben doorgegeven aan toArray. Deze methode zal kopieer de onderliggende array naar het destArray.

4. Met behulp van System.arraycopy

Ten slotte bekijken we System.arraycopy, die vrij gelijkaardig is aan Arrays.copyOf:

openbaar geheel getal [] addElementUsingSystemArrayCopy (geheel getal [] srcArray, int elementToAdd) {geheel getal [] destArray = nieuw geheel getal [srcArray.length + 1]; System.arraycopy (srcArray, 0, destArray, 0, srcArray.length); destArray [destArray.length - 1] = elementToAdd; retourneer destArray; }

Een interessant feit is dat Arrays.copyOf intern gebruikt deze methode.

Hier kunnen we merken dat we kopieer de elementen uit het srcArray naar destArray en dan voeg het nieuwe element toe naar de destArray.

5. Prestaties

Een ding dat bij alle oplossingen gebruikelijk is, is dat we op de een of andere manier een nieuwe array moeten maken. De reden hiervoor ligt in de manier waarop arrays in het geheugen worden toegewezen. Een array bevat een aaneengesloten geheugenblok voor supersnel opzoeken, daarom kunnen we het formaat niet eenvoudig wijzigen.

Dit heeft natuurlijk invloed op de prestaties, vooral bij grote arrays. Dit is waarom ArrayList over-allocates, waardoor het aantal keren dat de JVM nodig is om geheugen opnieuw toe te wijzen, effectief wordt verminderd.

Maar als we veel inserts doen, is een array misschien niet de juiste datastructuur en moeten we een LinkedList.

6. Conclusie

In dit artikel hebben we de verschillende manieren onderzocht om elementen aan het einde van een array toe te voegen.

En, zoals altijd, is de volledige code beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found