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:
- mind a vektor, mind az ArrayList growable array adatstruktúrát használ.
- az ezen osztályok által visszaadott iterátor és listiterátor (vektor és ArrayList) hibagyors.
- mindkettő rendezett gyűjteményosztály, mivel fenntartják az elemek beillesztési sorrendjét.
- Vektor & ArrayList mind a duplikált, mind a null értékeket engedélyezi.
- 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(); ...}