Diferența dintre ArrayList și Vector în java

ArrayList și Vector folosesc ambele matrice ca structură de date intern. Cu toate acestea, există puține diferențe în modul în care stochează și procesează datele. În acest post vom discuta despre diferența și asemănările dintre ArrayList și Vector.

ArrayList Vs Vector:

1) sincronizare: ArrayList nu este sincronizat, ceea ce înseamnă că mai multe fire pot funcționa pe ArrayList în același timp. De ex. dacă un fir efectuează o operație de adăugare pe ArrayList, poate exista un alt fir care efectuează operația de eliminare pe ArrayList în același timp într-un mediu multithreaded

în timp ce Vector este sincronizat. Acest lucru înseamnă că, dacă un fir este de lucru pe Vector, nici un alt fir poate obține o dețin de ea. Spre deosebire de ArrayList, un singur fir poate efectua o operație pe vector la un moment dat.

2) redimensionare: atât ArrayList, cât și Vector pot crește și micșora dinamic pentru a menține utilizarea optimă a stocării, totuși modul în care au redimensionat este diferit. ArrayList crește la jumătate din dimensiunea sa atunci când redimensionate în timp ce Vector dublează dimensiunea de sine în mod implicit atunci când crește.

3) performanță: ArrayList oferă o performanță mai bună, deoarece nu este sincronizată. Operațiunile vectoriale oferă performanțe slabe, deoarece sunt sigure pentru fir, firul care funcționează pe Vector primește o blocare pe el, ceea ce face ca alt fir să aștepte până când blocarea este eliberată.

4) fail-fast: mai întâi permiteți-mi să explic ce este fail-fast: Dacă colecția (ArrayList, vector etc.) este modificată structural prin orice mijloace, cu excepția metodelor de adăugare sau eliminare a iteratorului, după crearea iteratorului, iteratorul va arunca ConcurrentModificationException. Modificarea structurală se referă la adăugarea sau ștergerea elementelor din colecție.

conform vectorului javadoc, enumerarea returnată de Vector nu este rapidă. Pe de altă parte, iteratorul și listiteratorul returnate de ArrayList sunt rapide.

5) Cine face parte din cadrul de colectare într-adevăr? Vectorul nu a făcut parte din cadrul colecției, a fost inclus în colecții mai târziu. Poate fi considerat Cod vechi. Nu există nimic despre Vector pe care colecția de liste nu o poate face. Prin urmare, vectorul trebuie evitat. Dacă este nevoie de o funcționare sigură a firului, faceți ArrayList sincronizat așa cum sa discutat în următoarea secțiune a acestui post sau utilizați CopyOnWriteArrayList, care este o variantă sigură a firului ArrayList.

există puține asemănări între aceste clase, care sunt după cum urmează:

  1. atât vectorul, cât și Arraylistul folosesc structura de date growable array.
  2. iteratorul și listiteratorul returnate de aceste clase (Vector și ArrayList) sunt rapide.
  3. ambele sunt clase de colectare ordonate pe măsură ce mențin ordinea de inserare a elementelor.
  4. Vector & ArrayList ambele permite valori duplicat și null.
  5. ambele cresc și se micșorează automat atunci când se întâmplă revărsarea și ștergerea.

când să utilizați ArrayList și când să utilizați vector?

depinde în totalitate de cerință. În cazul în care există o nevoie de a efectua „thread-safe” operațiune vectorul este cel mai bun pariu, deoarece asigură că un singur fir de acces de colectare la un moment dat.

performanță: operațiunile sincronizate consumă mai mult timp în comparație cu cele nesincronizate, deci dacă nu este nevoie de o funcționare sigură a firului, ArrayList este o alegere mai bună, deoarece performanța va fi îmbunătățită din cauza proceselor concurente.

cum se face ArrayList sincronizat?
după cum am menționat mai sus, metodele ArrayList nu sunt sincronizate, dar totuși, dacă este nevoie, le puteți face sincronizate astfel –

//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(); ...}