Predĺženie dĺžky poľa

1. Prehľad

V tomto výučbe sa pozrieme na rôzne spôsoby, ako môžeme rozšíriť pole Java.

Pretože polia sú súvislým blokom pamäte, odpoveď nemusí byť zrejmá, ale poďme si to teraz rozbaliť.

2. Pomocou Polia.kopie

Najprv sa pozrime na Polia.kopie z. Skopírujeme pole a do kópie pridáme nový prvok:

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

Cesta Polia.kopie z funguje tak, že to vyžaduje srcArray a skopíruje počet prvkov zadaných v argumente dĺžka do nového poľa ktoré vnútorne vytvára. Argument, ktorý poskytujeme, je veľkosť nového poľa.

Jedna vec si treba všimnúť, že keď je argument dĺžky väčší ako veľkosť zdrojového poľa, Polia.kopie z vyplní ďalšie prvky v cieľovom poli znakom nulový.

V závislosti od údajového typu bude správanie výplne odlišné. Napríklad ak použijeme primitívne dátové typy namiesto Celé číslo potom sú ďalšie prvky vyplnené nulami. V prípade char, Polia.kopie vyplní ďalšie prvky znakom nulový a v prípade boolean, s nepravdivé.

3. Používanie ArrayList

Ďalším spôsobom, ako sa pozrieme na, je použitie ArrayList.

Najprv budeme previesť pole na ArrayLista potom pridajte prvok. Tak potom budeme previesť ArrayList späť na pole:

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

Všimnite si, že sme prešli srcArray jeho premenou na a Zbierka. The srcArray bude vyplniť podkladové pole v ArrayList.

Je potrebné si tiež uvedomiť, že cieľové pole sme odovzdali ako argument toArray. Táto metóda bude skopírujte podkladové pole do destArray.

4. Používanie System.arraycopy

Nakoniec sa pozrieme na System.arraycopy, ktoré sa dosť podobajú na Polia.kopie z:

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; návrat destArray; }

Jedna zaujímavá skutočnosť je, že Polia.kopie z interne používa túto metódu.

Tu si môžeme všimnúť, že my skopírujte prvky z srcArray do destArray a potom pridať nový prvok do destArray.

5. Výkon

Jedna vec spoločná vo všetkých riešeniach je, že musíme tak či onak vytvoriť nové pole. Dôvod spočíva v tom, ako sú polia alokované v pamäti. Pole obsahuje a súvislý blok pamäte pre superrýchle vyhľadávanie, a preto nemôžeme jednoducho zmeniť jeho veľkosť.

To má, samozrejme, vplyv na výkon, najmä pre veľké polia. To je dôvod, prečo ArrayList nadmerne pridelí, čím sa efektívne zníži počet prípadov, ktoré musí server JVM opätovne prideliť.

Ak však robíme veľa vložení, pole nemusí byť správna dátová štruktúra a mali by sme zvážiť a LinkedList.

6. Záver

V tomto článku sme preskúmali rôzne spôsoby pridávania prvkov na koniec poľa.

Celý kód je ako vždy k dispozícii na GitHub.


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