Estensione della lunghezza di una matrice

1. Panoramica

In questo tutorial, daremo uno sguardo ai diversi modi in cui possiamo estendere un array Java.

Poiché gli array sono un blocco contiguo di memoria, la risposta potrebbe non essere immediatamente evidente, ma scompattiamola ora.

2. Utilizzo di Arrays.copyOf

Per prima cosa, diamo un'occhiata a Arrays.copyOf . Copieremo l'array e aggiungeremo un nuovo elemento alla copia:

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

Il modo in cui funziona Arrays.copyOf è che prende srcArray e copia il numero di elementi specificato nell'argomento length in un nuovo array che crea internamente. La dimensione del nuovo array è l'argomento che forniamo.

Una cosa da notare è che quando l'argomento length è maggiore della dimensione dell'array di origine, Arrays.copyOf riempirà gli elementi aggiuntivi nell'array di destinazione con null .

A seconda del tipo di dati, il comportamento del riempimento sarà diverso. Ad esempio, se usiamo tipi di dati primitivi al posto di Integer, gli elementi extra vengono riempiti con gli zeri. Nel caso di char , Arrays.copyOf riempirà gli elementi aggiuntivi con null e in caso di boolean con false .

3. Utilizzo di ArrayList

Il prossimo modo che vedremo è usare ArrayList.

Per prima cosa convertiremo l'array in un ArrayList e quindi aggiungeremo l'elemento. Quindi riconvertiremo ArrayList in un array :

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

Nota che abbiamo passato srcArray convertendolo in una raccolta. Lo srcArray sarà compilare la matrice sottostante nel ArrayList .

Inoltre, un'altra cosa da notare è che abbiamo passato l'array di destinazione come argomento a toArray . Questo metodo copierà l'array sottostante in destArray .

4. Utilizzo di System.arraycopy

Infine, daremo un'occhiata a System.arraycopy , che è abbastanza simile a 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; return destArray; }

Un fatto interessante è che Arrays.copyOf utilizza internamente questo metodo.

Qui possiamo notare che copiamo gli elementi da srcArray a destArray e quindi aggiungiamo il nuovo elemento a destArray .

5. Prestazioni

Una cosa comune a tutte le soluzioni è che dobbiamo creare un nuovo array in un modo o nell'altro. La ragione sta nel modo in cui gli array vengono allocati in memoria. Un array contiene un blocco di memoria contiguo per una ricerca super veloce, motivo per cui non possiamo semplicemente ridimensionarlo.

Questo, ovviamente, ha un impatto sulle prestazioni, soprattutto per gli array di grandi dimensioni. Questo è il motivo per cui ArrayList esegue l'allocazione eccessiva, riducendo in modo efficace il numero di volte in cui JVM deve riallocare la memoria.

Ma, se stiamo facendo molti inserimenti, un array potrebbe non essere la giusta struttura dati e dovremmo considerare un LinkedList .

6. Conclusione

In questo articolo, abbiamo esplorato i diversi modi di aggiungere elementi alla fine di un array.

E, come sempre, l'intero codice è disponibile su GitHub.