Differenza tra ArrayList e Vector In java

ArrayList e Vector utilizzano entrambi Array come struttura dati internamente. Tuttavia ci sono poche differenze nel modo in cui memorizzano ed elaborano i dati. In questo post discuteremo la differenza e le somiglianze tra ArrayList e Vector.

ArrayList Vs Vector:

1) Sincronizzazione: ArrayList non è sincronizzato, il che significa che più thread possono funzionare su ArrayList contemporaneamente. Per esempio se un thread sta eseguendo un’operazione di aggiunta su ArrayList, può esserci un altro thread che esegue l’operazione di rimozione su ArrayList contemporaneamente in un ambiente multithread

mentre Vector è sincronizzato. Ciò significa che se un thread sta lavorando su Vector, nessun altro thread può entrarne in possesso. A differenza di ArrayList, solo un thread può eseguire un’operazione su vector alla volta.

2) Ridimensiona: sia ArrayList che Vector possono crescere e ridursi dinamicamente per mantenere l’uso ottimale dello storage, tuttavia il modo in cui vengono ridimensionati è diverso. ArrayList cresce della metà della sua dimensione quando viene ridimensionata mentre Vector raddoppia la dimensione di se stesso per impostazione predefinita quando cresce.

3) Prestazioni: ArrayList offre prestazioni migliori in quanto non sincronizzato. Le operazioni vettoriali offrono prestazioni scadenti in quanto sono thread-safe, il thread che funziona su Vector ottiene un blocco su di esso che fa aspettare l’altro thread fino al rilascio del blocco.

4) fail-fast: prima lasciatemi spiegare cosa è fail-fast: Se la raccolta (ArrayList, vector ecc.) viene strutturalmente modificata con qualsiasi mezzo, ad eccezione dei metodi add o remove di iterator, dopo la creazione di iterator, l’iteratore genererà ConcurrentModificationException. La modifica strutturale si riferisce all’aggiunta o alla cancellazione di elementi dalla collezione.

Come per il vettore javadoc l’enumerazione restituita dal vettore non è fail-fast. Dall’altro lato l’iteratore e l’listiteratore restituiti da ArrayList sono fail-fast.

5) Chi appartiene davvero al framework di raccolta? Il vettore non era la parte del framework di raccolta, è stato incluso nelle raccolte in seguito. Può essere considerato come codice legacy. Non c’è nulla di Vettoriale che la raccolta di elenchi non possa fare. Pertanto il vettore dovrebbe essere evitato. Se è necessario eseguire operazioni thread-safe, eseguire ArrayList sincronizzato come discusso nella prossima sezione di questo post o utilizzare CopyOnWriteArrayList che è una variante thread-safe di ArrayList.

Ci sono poche somiglianze tra queste classi che sono le seguenti:

  1. Sia Vector che ArrayList utilizzano una struttura di dati di array coltivabile.
  2. L’iteratore e l’listiteratore restituiti da queste classi (Vector e ArrayList) sono fail-fast.
  3. Entrambi sono classi di raccolta ordinate in quanto mantengono l’ordine di inserimento degli elementi.
  4. Vector & ArrayList consente entrambi i valori duplicati e null.
  5. Entrambi crescono e si restringono automaticamente quando si verificano overflow e cancellazione.

Quando usare ArrayList e quando usare vector?

Dipende totalmente dal requisito. Se è necessario eseguire un’operazione “thread-safe”, il vettore è la soluzione migliore in quanto garantisce che solo un thread acceda alla raccolta alla volta.

Prestazioni: le operazioni sincronizzate consumano più tempo rispetto a quelle non sincronizzate, quindi se non è necessario eseguire operazioni sicure con thread, ArrayList è una scelta migliore poiché le prestazioni saranno migliorate a causa dei processi simultanei.

Come rendere sincronizzato ArrayList?
Come ho detto sopra i metodi ArrayList non sono sincronizzati, ma comunque se c’è bisogno puoi renderli sincronizzati in questo modo –

//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}