Proširenje dužine niza

1. Pregled

U ovom uputstvu ćemo pogledati različite načine na koje možemo proširiti Java niz.

Budući da su nizovi susjedni blok memorije, odgovor možda neće biti očit, ali raspakirajmo ga sada.

2. Korištenje Nizovi.kopijaOf

Prvo, pogledajmo Nizovi.kopijaOf. Kopirat ćemo niz i kopiji dodati novi element:

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

Put Nizovi.kopijaOf djela je da je potrebno srcArray i kopira broj elemenata navedenih u argumentu length u novi niz koje iznutra stvara. Veličina novog polja je argument koji pružamo.

Jedna stvar koju treba primijetiti je da kada je argument dužine veći od veličine izvornog niza, Nizovi.kopijaOf ispunit će dodatne elemente u odredišnom nizu s null.

Ovisno o tipu podataka, ponašanje punjenja bit će različito. Na primjer, ako umjesto. Koristimo primitivne vrste podataka Cijeli broj tada se dodatni elementi popunjavaju nulama. U slučaju ugljen, Nizovi.kopijaOf ispunit će dodatne elemente sa null a u slučaju boolean, s lažno.

3. Korištenje ArrayList

Sljedeći način na koji ćemo pogledati je korištenje ArrayList.

Prvo ćemo pretvori niz u ArrayLista zatim dodajte element. Onda ćemo pretvoriti ArrayList natrag u niz:

javni Integer [] addElementUsingArrayList (Integer [] srcArray, int elementToAdd) {Integer [] destArray = novi cijeli broj [srcArray.length + 1]; ArrayList arrayList = novi ArrayList (Arrays.asList (srcArray)); arrayList.add (elementToAdd); vrati arrayList.toArray (destArray); }

Imajte na umu da smo prošli srcArray pretvaranjem u a Kolekcija. The srcArray htjeti popunite temeljni niz u ArrayList.

Također, još jedna stvar koju treba napomenuti je da smo kao argument proslijedili odredišni niz toArray. Ova metoda će kopirajte temeljni niz u destArray.

4. Korištenje System.arraycopy

Na kraju ćemo pogledati System.arraycopy, koji je vrlo sličan Nizovi.kopijaOf:

javni Integer [] addElementUsingSystemArrayCopy (Integer [] srcArray, int elementToAdd) {Integer [] destArray = novi cijeli broj [srcArray.length + 1]; System.arraycopy (srcArray, 0, destArray, 0, srcArray.length); destArray [destArray.length - 1] = elementToAdd; vratiti destArray; }

Jedna zanimljiva činjenica je ta Nizovi.kopijaOf interno koristi ovu metodu.

Ovdje možemo primijetiti da mi kopirajte elemente iz srcArray do destArray i onda dodaj novi element prema destArray.

5. Izvedba

Jedna je zajednička stvar svih rješenja da na ovaj ili onaj način moramo stvoriti novi niz. Razlog tome leži u tome kako su nizovi raspoređeni u memoriji. Niz sadrži a susjedni blok memorije za super-brzo traženje, zbog čega mu ne možemo jednostavno promijeniti veličinu.

To, naravno, utječe na performanse, posebno za velike nizove. To je razlog zašto ArrayList prekomjerno dodjeljuje, učinkovito smanjujući broj puta koji JVM treba za preraspodjelu memorije.

Ali, ako radimo puno umetanja, niz možda nije prava struktura podataka, te bismo trebali razmotriti LinkedList.

6. Zaključak

U ovom smo članku istražili različite načine dodavanja elemenata na kraj niza.

I kao i uvijek, cijeli je kôd dostupan na GitHub-u.