Quali sono le differenze tra ArrayList e Vector?


352

Quali sono le differenze tra le due strutture di dati ArrayList e Vector e dove dovresti usare ognuna di esse?


5
Non vedo il duplicato esatto qui.
Jeff Atwood,

2
Bene, puoi anche creare vettori in java - Vector v = new Vector(3, 2);
sgsi,

Non usare Vector, usare ArrayListo LinkedListo ArrayDeque

Risposte:


365

differenze

  • I vettori sono sincronizzati, ArrayLists no.
  • Metodi di crescita dei dati

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.

Riferimento

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.

Riferimento


7
@Rei Esattamente quello che ha detto: thread multipli ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException

Che dire della LETTURA da una ArrayList in modo multithread? È sicuro per i thread?
Xunie,

@Xunie Leggere da ArrayList o altre classi di raccolte non è mai un problema. Il problema sorge quando si aggiungono, si rimuovono o si modificano i valori esistenti in ArrayList o nella raccolta.
sainath reddy,

85

Come dice la documentazione, a Vector e an ArrayListsono quasi equivalenti. La differenza è che l'accesso a un Vectorè sincronizzato, mentre l'accesso a un ArrayListnon lo è. Ciò significa che solo un thread può chiamare metodi Vectoralla 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.synchronizedListfunzione per creare un elenco sincronizzato, ottenendo così l'equivalente di a Vector.


53

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.


10
sincronizzato ma non sicuro? cosa significa? [Sono principiante]
Dineshkumar

13
@Dineshkumar 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.
Boemia

1
@Dineshkumar vedi questa domanda
Boemia

3
@Dineshkumar scusa, non era un buon collegamento. ecco la risposta definitiva . In breve, la sua sincronizzazione è inutile.
Boemia

7
Curiosità: lo Stack di Java1.7 utilizza la classe Vector.
Tobi,

26

ArrayList è più recente e il 20-30% più veloce.

Se non hai bisogno di qualcosa di esplicitamente evidente in Vector, usaArrayList


32
Potete sostenere il reclamo fornendo prove 20-30% faster?
utente

5
@user All'epoca si trattava solo di un'esperienza personale derivante dallo scuotimento di enormi matrici. Da tre anni a questa parte, non posso indicarti esattamente di cosa stavo parlando, ma ci sono molti benchmark là fuori. Non è fino al threading dove vedi i salti più grandi ma eccone uno: javacodegeeks.com/2010/08/…
Oli

Il 20-30% corrisponde solo se leggi e scrivi al Vector / Arraylist, poiché la funzione di crescita avrà il maggiore impatto. Se hai un benchmark che scrive solo una volta e quindi esegue solo letture, otterrai un risultato diverso
Tobi

2
Fornisci una prova per i tuoi dati
markmark

Poiché il vettore è sincronizzato e l'arraylist non è sincronizzato, ciò può essere una ragione, l'arraylist è più veloce del vettore.
CHIEDERE il

23

Esistono 2 principali differenze tra Vector e ArrayList.

  1. 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.

  2. 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:

  1. Per ottenere l'elemento in una particolare posizione da Vector usiamo la funzione elementAt (int index). Questo nome di funzione è molto lungo. Al posto di questo in ArrayList abbiamo get (int index) che è molto facile da ricordare e da usare.
  2. Allo stesso modo per sostituire un elemento esistente con un nuovo elemento in Vector usiamo il metodo setElementAt (), che è di nuovo molto lungo e può irritare il programmatore per l'uso ripetuto. Al posto di questo ArrayList ha aggiunto il metodo (int index, object) che è facile da usare e da ricordare. In questo modo hanno nomi di funzioni più facili da programmare e facili da usare in ArrayList.

Quando usare quale?

  1. Cerca di evitare di usare completamente i vettori. ArrayLists può fare tutto ciò che un Vector può fare. Più su ArrayLists non sono sincronizzati per impostazione predefinita. Se lo desideri, puoi sincronizzarlo quando ne hai bisogno utilizzando la classe util di Collections.
  2. ArrayList ha facili da ricordare e utilizzare i nomi delle funzioni.

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.


5
Informazioni errate (commutate) su dimensioni crescenti per ArrayLIst e Vector, altrimenti risposta abbastanza buona.
Nenad Bulatovic,

La crescita di Vector sta raddoppiando con i necessari docs.oracle.com/javase/7/docs/api/java/util/Vector.html mentre di ArrayList "I dettagli della politica di crescita non sono specificati oltre al fatto che l'aggiunta di un elemento ha costo del tempo ammortizzato costante ". docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib

Non capisco come il nome del metodo possa essere un criterio per usare o non usare quel metodo.
Surender Kherwa,

14

ArrayListed Vectorentrambi implementano l'interfaccia List e mantengono l'ordine di inserimento. Ma ci sono molte differenze tra ArrayListe le Vectorclassi ...

ArrayList -

  1. ArrayList non è sincronizzato.
  2. ArrayList incrementa il 50% della dimensione attuale dell'array se il numero di elementi supera la sua capacità.
  3. ArrayList non è una classe legacy, è stata introdotta in JDK 1.2.
  4. ArrayList è veloce perché non è sincronizzato.
  5. ArrayList utilizza l'interfaccia Iterator per attraversare gli elementi.

Vettore -

  1. Vector è sincronizzato.
  2. Vector incrementi del 100% significa raddoppiare la dimensione dell'array se il numero totale di elementi supera la sua capacità.
  3. Vector è una classe legacy.

  4. 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.

  5. Vectorutilizza l'interfaccia di enumerazione per attraversare gli elementi. Ma può usare anche Iterator.

Vedi anche: https://www.javatpoint.com/difference-between-arraylist-and-vector


10

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: inserisci qui la descrizione dell'immagine


1
Perché l'aggiunta di oggetti all'inizio e alla fine in LinkedList è lenta? Non dovrebbe essere più veloce di ENTRAMBE arrayList e vector?
CHANISTA

@CHANist Anche io sono d'accordo. L'aggiunta di un oggetto all'inizio e alla fine dovrebbe essere più rapida dell'aggiunta di un oggetto nel mezzo di esso.
Rahul Rastogi,

1
Il linguaggio utilizzato nella colonna LinkedList di questa tabella è contraddittorio. Sia anteporre che aggiungere a un elenco collegato sono più veloci dell'aggiunta di elementi nel mezzo, ma più lenti rispetto all'aggiunta o all'aggiunta di array o vettori. Questo perché ogni inserimento richiede l'allocazione di memoria con riferimenti non locali, aumentando la possibilità di errori nella cache. Anche se la ricerca in una LinkedList è lineare con il numero di elementi e non viene memorizzato un puntatore alla fine, l'aggiunta è ancora più veloce della preposizione poiché la memoria viene riallocata per un solo elemento.
Sophia Gold,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.