Aggiunta di un elemento a un array Java rispetto a un ArrayList

1. Panoramica

In questo tutorial, esamineremo brevemente le somiglianze e le differenze nell'allocazione della memoria tra gli array Java e lo standard ArrayList . Inoltre, vedremo come aggiungere e inserire elementi in un array e in ArrayList .

2. Array Java e ArrayList

Un array Java è una struttura dati di base fornita dal linguaggio. Al contrario, ArrayList è un'implementazione dell'interfaccia List supportata da un array ed è fornita in Java Collections Framework.

2.1. Accesso e modifica di elementi

Possiamo accedere e modificare gli elementi dell'array utilizzando la notazione delle parentesi quadre:

System.out.println(anArray[1]); anArray[1] = 4;

D'altra parte, ArrayList ha una serie di metodi per accedere e modificare gli elementi:

int n = anArrayList.get(1); anArrayList.set(1, 4);

2.2. Dimensioni fisse e dinamiche

Un array e ArrayList allocano entrambi la memoria heap in modo simile, ma ciò che differisce è che un array è di dimensioni fisse, mentre la dimensione di un ArrayList aumenta dinamicamente.

Poiché un array Java è di dimensioni fisse, è necessario fornire la dimensione durante l'istanza. Non è possibile aumentare la dimensione dell'array una volta che è stata istanziata. Invece, dobbiamo creare un nuovo array con la dimensione modificata e copiare tutti gli elementi dall'array precedente.

ArrayList è un'implementazione di array ridimensionabile dell'interfaccia List , ovvero ArrayList cresce dinamicamente man mano che gli elementi vengono aggiunti. Quando il numero di elementi correnti (incluso il nuovo elemento da aggiungere a ArrayList ) è maggiore della dimensione massima dell'array sottostante, ArrayList aumenta la dimensione dell'array sottostante.

La strategia di crescita per l'array sottostante dipende dall'implementazione di ArrayList . Tuttavia, poiché la dimensione della matrice sottostante non può essere aumentata dinamicamente, viene creata una nuova matrice e i vecchi elementi della matrice vengono copiati nella nuova matrice.

L'operazione di aggiunta ha un costo temporale ammortizzato costante. In altre parole, l'aggiunta di n elementi a un ArrayList richiede O (n) tempo.

2.3. Tipi di elementi

Un array può contenere tipi di dati primitivi e non primitivi, a seconda della definizione dell'array. Tuttavia, un ArrayList può contenere solo tipi di dati non primitivi .

Quando inseriamo elementi con tipi di dati primitivi in ​​un ArrayList , il compilatore Java converte automaticamente il tipo di dati primitivo nella sua classe wrapper oggetto corrispondente.

Vediamo ora come aggiungere e inserire elementi negli array Java e nell'ArrayList .

3. Aggiunta di un elemento

Come abbiamo già visto, gli array hanno dimensioni fisse.

Quindi, per aggiungere un elemento, prima dobbiamo dichiarare un nuovo array che è più grande del vecchio array e copiare gli elementi dal vecchio array a quello appena creato. Dopodiché, possiamo aggiungere il nuovo elemento a questo array appena creato.

Diamo un'occhiata alla sua implementazione in Java senza utilizzare classi di utilità:

public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length+1]; for(int i = 0; i < srcArray.length; i++) { destArray[i] = srcArray[i]; } destArray[destArray.length - 1] = elementToAdd; return destArray; }

In alternativa, la classe Arrays fornisce un metodo di utilità copyOf () , che aiuta a creare un nuovo array di dimensioni maggiori e copiare tutti gli elementi dal vecchio array:

int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);

Dopo aver creato un nuovo array, possiamo facilmente aggiungere il nuovo elemento all'array:

destArray[destArray.length - 1] = elementToAdd;

D'altra parte, aggiungere un elemento in ArrayList è abbastanza semplice :

anArrayList.add(newElement);

4. Inserimento di un elemento all'indice

Inserire un elemento in un dato indice senza perdere gli elementi aggiunti in precedenza non è un'attività semplice negli array.

Prima di tutto, se l'array contiene già il numero di elementi uguale alla sua dimensione, allora dobbiamo prima creare un nuovo array con una dimensione maggiore e copiare gli elementi sul nuovo array.

Inoltre, dobbiamo spostare tutti gli elementi che vengono dopo l'indice specificato di una posizione a destra:

public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) { int[] destArray = new int[srcArray.length+1]; int j = 0; for(int i = 0; i < destArray.length-1; i++) { if(i == index) { destArray[i] = newElement; } else { destArray[i] = srcArray[j]; j++; } } return destArray; }

Tuttavia, la classe ArrayUtils ci offre una soluzione più semplice per inserire elementi in un array :

int[] destArray = ArrayUtils.insert(2, srcArray, 77);

Dobbiamo specificare l'indice in cui vogliamo inserire il valore, l'array di origine e il valore da inserire.

Il metodo insert () restituisce un nuovo array contenente un numero maggiore di elementi, con il nuovo elemento all'indice specificato e tutti gli elementi rimanenti spostati di una posizione a destra.

Nota che l'ultimo argomento del metodo insert () è un argomento variabile, quindi possiamo inserire un numero qualsiasi di elementi in un array.

Usiamolo per inserire tre elementi in srcArray a partire dall'indice due:

int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);

E gli elementi rimanenti verranno spostati di tre posizioni a destra.

Inoltre, questo può essere ottenuto banalmente per ArrayList :

anArrayList.add(index, newElement);

ArrayList sposta gli elementi e inserisce l'elemento nella posizione richiesta.

5. conclusione

In questo articolo, abbiamo esaminato gli array Java e ArrayList . Inoltre, abbiamo esaminato le somiglianze e le differenze tra i due. Infine, abbiamo visto come aggiungere e inserire elementi in un array e in ArrayList .

Come sempre, il codice sorgente completo degli esempi funzionanti è disponibile su GitHub.