Különbség az ArrayList és a vector között a java-ban

az ArrayList és a Vector egyaránt belső adatstruktúraként használja a tömböt. Kevés különbség van azonban az adatok tárolásának és feldolgozásának módjában. Ebben a bejegyzésben az ArrayList és a vektor közötti különbséget és hasonlóságokat tárgyaljuk.

ArrayList Vs Vector:

1) szinkronizálás: ArrayList nem szinkronizált, ami azt jelenti, több szál működhet ArrayList ugyanabban az időben. Pl. ha az egyik szál add műveletet hajt végre az ArrayList-en, akkor lehet egy másik szál, amely egyszerre végez eltávolítási műveletet az ArrayList-en egy többszálú környezetben

miközben a vektor szinkronizálva van. Ez azt jelenti, hogy ha az egyik szál vektoron dolgozik, akkor egyetlen másik szál sem tudja megszerezni. Az ArrayList-től eltérően egyszerre csak egy szál végezhet műveletet a vektoron.

2) átméretezés: mind az ArrayList, mind a vektor dinamikusan növekedhet és zsugorodhat a tárolás optimális kihasználása érdekében, azonban az átméretezés módja eltérő. Az ArrayList méretének felére nő, ha átméretezik, míg a vektor alapértelmezés szerint megduplázza önmagának méretét, amikor növekszik.

3) teljesítmény: az ArrayList jobb teljesítményt nyújt, mivel nem szinkronizált. A vektor műveletek gyenge teljesítményt nyújtanak, mivel szálbiztonságosak, a vektoron működő szál zárat kap rajta, ami más szálat vár, amíg a zár ki nem oldódik.

4) fail-fast: először hadd magyarázzam el, mi a fail-fast: Ha a gyűjtemény (ArrayList, vektor stb.) szerkezetileg bármilyen módon módosul, kivéve az iterátor hozzáadása vagy eltávolítása metódusokat, az iterátor létrehozása után az iterátor ConcurrentModificationException – et dob. A szerkezeti módosítás a gyűjteményből származó elemek hozzáadására vagy törlésére utal.

a javadoc Vektor szerint a vektor által visszaadott felsorolás nem sikertelen. A másik oldalon az ArrayList által visszaadott iterátor és listiterátor fail-fast.

5) ki tartozik a gyűjtemény keret igazán? A vektor nem volt része a gyűjtemény keretrendszernek, később bekerült a gyűjteményekbe. Örökölt kódnak tekinthető. Nincs semmi vektor, amely lista gyűjtemény nem tud. Ezért a vektort kerülni kell. Ha szálbiztos működésre van szükség, szinkronizálja az ArrayList-t a bejegyzés következő szakaszában leírtak szerint, vagy használja a CopyOnWriteArrayList-t, amely az ArrayList szálbiztos változata.

kevés hasonlóság van ezen osztályok között, amelyek a következők:

  1. mind a vektor, mind az ArrayList growable array adatstruktúrát használ.
  2. az ezen osztályok által visszaadott iterátor és listiterátor (vektor és ArrayList) hibagyors.
  3. mindkettő rendezett gyűjteményosztály, mivel fenntartják az elemek beillesztési sorrendjét.
  4. Vektor & ArrayList mind a duplikált, mind a null értékeket engedélyezi.
  5. mindkettő automatikusan növekszik és zsugorodik, amikor túlcsordulás és törlés történik.

mikor kell használni az ArrayList és mikor kell használni a vektort?

ez teljesen a követelménytől függ. Ha szükség van a “menetbiztos” művelet végrehajtására, akkor a vektor a legjobb megoldás, mivel biztosítja, hogy egyszerre csak egy szál férjen hozzá a gyűjteményhez.

teljesítmény: a szinkronizált műveletek több időt fogyasztanak a nem szinkronizált műveletekhez képest, így ha nincs szükség a menet biztonságos működésére, az ArrayList jobb választás, mivel a teljesítmény javul az egyidejű folyamatok miatt.

hogyan lehet szinkronizálni az ArrayList-t?
mint fentebb említettem, az ArrayList módszerek nem szinkronizálva vannak, de ha szükség van rá, szinkronizálhatja őket így –

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