Utvide en Array’s Length

1. Oversikt

I denne opplæringen tar vi en titt på de forskjellige måtene vi kan utvide et Java-utvalg.

Siden matriser er en sammenhengende hukommelsesblokk, er svaret kanskje ikke lett, men la oss pakke ut det nå.

2. Bruke Arrays.copyOf

La oss først se på Arrays.copyOf. Vi kopierer matrisen og legger til et nytt element i kopien:

public Integer [] addElementUsingArraysCopyOf (Integer [] srcArray, int elementToAdd) {Integer [] destArray = Arrays.copyOf (srcArray, srcArray.length + 1); destArray [destArray.length - 1] = elementToAdd; returnere destArray; }

Veien Arrays.copyOf fungerer er at det tar srcArray og kopierer antall elementer spesifisert i lengdeargumentet til en ny matrise som det internt skaper. Størrelsen på den nye matrisen er argumentet vi gir.

En ting å merke seg er at når lengdeargumentet er større enn størrelsen på kildearrayet, Arrays.copyOf vil fylle de ekstra elementene i destinasjonsmatrisen med null.

Avhengig av datatype, vil oppførselen til fyllingen være annerledes. For eksempel hvis vi bruker primitive datatyper i stedet for Heltall så fylles de ekstra elementene med nuller. I tilfelle av røye, Arrays.copyOf vil fylle ekstra elementer med null og i tilfelle boolsk, med falsk.

3. Bruke ArrayList

Den neste måten vi vil se på er å bruke ArrayList.

Vi skal først konvertere matrisen til en ArrayListog legg deretter til elementet. Så vil vi konvertere ArrayList tilbake til en matrise:

public Integer [] addElementUsingArrayList (Integer [] srcArray, int elementToAdd) {Integer [] destArray = new Integer [srcArray.length + 1]; ArrayList arrayList = ny ArrayList (Arrays.asList (srcArray)); arrayList.add (elementToAdd); return arrayList.toArray (destArray); }

Merk at vi har passert srcArray ved å konvertere den til en Samling. De srcArray vil fyll ut den underliggende matrisen i ArrayList.

En annen ting å merke seg er at vi har bestått destinasjonsmatrisen som et argument til toArray. Denne metoden vil kopier den underliggende matrisen til destArray.

4. Bruke System.arraycopy

Til slutt tar vi en titt på System.arraycopy, som ganske lik Arrays.copyOf:

public Integer [] addElementUsingSystemArrayCopy (Integer [] srcArray, int elementToAdd) {Integer [] destArray = new Integer [srcArray.length + 1]; System.arraycopy (srcArray, 0, destArray, 0, srcArray.length); destArray [destArray.length - 1] = elementToAdd; returnere destArray; }

Et interessant faktum er at Arrays.copyOf bruker denne metoden internt.

Her kan vi merke at vi kopier elementene fra srcArray til destArray og så legg til det nye elementet til destArray.

5. Ytelse

En ting som er vanlig i alle løsningene er at vi må lage en ny matrise på en eller annen måte. Årsaken til det ligger i hvordan matriser fordeles i minnet. En matrise har en sammenhengende hukommelsesblokk for superrask oppslag, og det er derfor vi ikke bare kan endre størrelsen på den.

Dette har selvfølgelig ytelsespåvirkning, spesielt for store matriser. Dette er grunnen ArrayList overfordeler, noe som effektivt reduserer antall ganger JVM trenger for å omfordele minne.

Men hvis vi gjør mange innlegg, er det ikke sikkert at en matrise er den riktige datastrukturen, og vi bør vurdere a LinkedList.

6. Konklusjon

I denne artikkelen har vi utforsket de forskjellige måtene å legge til elementer på slutten av en matrise.

Og som alltid er hele koden tilgjengelig på GitHub.


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