Quali sono le differenze tra le due strutture di dati ArrayList e Vector e dove dovresti usare ognuna di esse?
Vector v = new Vector(3, 2);
Quali sono le differenze tra le due strutture di dati ArrayList e Vector e dove dovresti usare ognuna di esse?
Vector v = new Vector(3, 2);
Risposte:
differenze
Utilizzare ArrayLists se non vi sono requisiti specifici per l'utilizzo di Vettori.
Sincronizzazione
Se più thread accedono contemporaneamente ad una ArrayList, allora dobbiamo sincronizzare esternamente il blocco di codice che modifica strutturalmente l'elenco o modifica semplicemente un elemento. Modifica strutturale significa aggiunta o cancellazione di elementi dall'elenco. L'impostazione del valore di un elemento esistente non è una modifica strutturale.
Collections.synchronizedList
viene normalmente utilizzato al momento della creazione dell'elenco per evitare qualsiasi accesso accidentale non sincronizzato all'elenco.
Crescita dei dati
Internamente, sia ArrayList che Vector mantengono il loro contenuto usando un array. Quando un elemento viene inserito in una ArrayList o in un Vector, l'oggetto dovrà espandere la sua matrice interna se esaurisce lo spazio. Per impostazione predefinita, un vettore raddoppia le dimensioni del suo array, mentre ArrayList aumenta le dimensioni del suo array del 50 percento.
Come dice la documentazione, a Vector
e an ArrayList
sono quasi equivalenti. La differenza è che l'accesso a un Vector
è sincronizzato, mentre l'accesso a un ArrayList
non lo è. Ciò significa che solo un thread può chiamare metodi Vector
alla volta e c'è un leggero sovraccarico nell'acquisizione del lock; se usi un ArrayList
, questo non è il caso. In genere, ti consigliamo di utilizzare un ArrayList
; nel caso a thread singolo è una scelta migliore e nel caso a thread multipli, si ottiene un migliore controllo sul blocco. Vuoi consentire letture simultanee? Belle. Vuoi eseguire una sincronizzazione per un batch di dieci scritture? Anche bene. Richiede un po 'più di cura da parte tua, ma è probabilmente quello che vuoi. Si noti inoltre che se si dispone di un ArrayList, è possibile utilizzareCollections.synchronizedList
funzione per creare un elenco sincronizzato, ottenendo così l'equivalente di a Vector
.
Vector
è una classe spezzata che non è sicura per i thread, nonostante sia "sincronizzata" ed è utilizzata solo da studenti e altri programmatori inesperti.
ArrayList
è l'implementazione dell'elenco di riferimento utilizzata da professionisti e programmatori esperti.
I professionisti che desiderano un'implementazione dell'elenco thread-safe utilizzano a CopyOnWriteArrayList
.
Vector
è stato destinato ad essere threadsafe, ma ha un difetto di progettazione che lo rende non * è infatti threadsafe, è fondamentalmente una classe deprecato. Per qualche ragione, le università ecc. Non hanno sentito parlare di questa notizia e ne sostengono ancora l'uso.
ArrayList
è più recente e il 20-30% più veloce.
Se non hai bisogno di qualcosa di esplicitamente evidente in Vector
, usaArrayList
20-30% faster
?
Esistono 2 principali differenze tra Vector e ArrayList.
Il vettore è sincronizzato per impostazione predefinita e ArrayList no. Nota: è possibile rendere ArrayList anche sincronizzato passando l'oggetto arraylist al metodo Collections.synchronizedList (). Sincronizzato significa: può essere utilizzato con più thread senza effetti collaterali.
Le liste di array crescono del 50% della dimensione precedente quando lo spazio non è sufficiente per il nuovo elemento, mentre Vector crescerà del 100% della dimensione precedente quando non c'è spazio per il nuovo elemento in arrivo.
Oltre a questo, ci sono alcune differenze pratiche tra loro, in termini di sforzo di programmazione:
Quando usare quale?
Nota : anche se l'arraylist cresce del 100%, è possibile evitarlo con il metodo ensurecapacity () per assicurarsi di allocare memoria sufficiente nelle fasi iniziali stesse.
Spero che sia d'aiuto.
ArrayList
ed Vector
entrambi implementano l'interfaccia List e mantengono l'ordine di inserimento. Ma ci sono molte differenze tra ArrayList
e le Vector
classi ...
ArrayList
non è sincronizzato.ArrayList
incrementa il 50% della dimensione attuale dell'array se il numero di elementi supera la sua capacità.ArrayList
non è una classe legacy, è stata introdotta in JDK 1.2.ArrayList
è veloce perché non è sincronizzato.ArrayList
utilizza l'interfaccia Iterator per attraversare gli elementi.Vettore -
Vector
è sincronizzato.Vector
incrementi del 100% significa raddoppiare la dimensione dell'array se il numero totale di elementi supera la sua capacità.Vector
è una classe legacy.
Vector
è lento perché è sincronizzato, cioè in ambiente multithreading, manterrà gli altri thread in stato eseguibile o non eseguibile fino a quando il thread corrente non rilascia il blocco dell'oggetto.
Vector
utilizza l'interfaccia di enumerazione per attraversare gli elementi. Ma può usare anche Iterator.
Vedi anche: https://www.javatpoint.com/difference-between-arraylist-and-vector
Fondamentalmente sia ArrayList che Vector usano entrambi gli array di oggetti interni.
ArrayList: la classe ArrayList estende AbstractList e implementa l'interfaccia List e RandomAccess (interfaccia marker). ArrayList supporta array dinamici che possono crescere in base alle esigenze. Ci dà la prima iterazione sugli elementi. ArrayList utilizza un array di oggetti interno; vengono creati con una dimensione iniziale predefinita di 10. Quando questa dimensione viene superata, la raccolta aumenta automaticamente alla metà della dimensione predefinita pari a 15.
Vettore: il vettore è simile a ArrayList ma le differenze sono, è sincronizzato e la sua dimensione iniziale predefinita è 10 e quando la dimensione supera la sua dimensione aumenta al doppio della dimensione originale, il che significa che la nuova dimensione sarà 20. Il vettore è l'unica classe diverso da ArrayList per implementare RandomAccess. Il vettore ha quattro costruttori su quello che accetta due parametri Vector (int initialCapacity, int capacityIncrement) capacityIncrement è la quantità di aumento della capacità quando il vettore trabocca, quindi ha un maggiore controllo sul fattore di carico.
Alcune altre differenze sono: