Java ArrayList vs Vector
1. Áttekintés
Ebben az oktatóanyagban a. közötti különbségekre fogunk összpontosítani Tömb lista és Vektor osztályok. Mindkettő a Java Gyűjtemények keretrendszeréhez tartozik, és megvalósítja a java.util.List felület.
Azonban, ezeknek az osztályoknak jelentős különbségei vannak megvalósításaikban.
2. Mi a különbség?
Gyors indításként mutassuk be a legfontosabb különbségeket Tömb lista és Vektor. Ezután néhány pontot részletesebben megvitatunk:
- szinkronizálás - Az első nagyobb különbség e kettő között. Vektor szinkronizálva van és Tömb lista nem.
- méretnövekedés - Egy másik különbség a kettő között az, ahogy átméretezik, miközben elérik kapacitásukat. A Vektor megduplázza a méretét. Ellentétben, Tömb lista csak a hossza felével növekszik
- iteráció - És Vektor lehet használni Iterátor és Felsorolás hogy áthaladjon az elemek felett. Másrészről, Tömb lista csak használni tudja Iterátor.
- teljesítmény - nagyrészt a szinkronizálás miatt, Vektor műveletek lassabbak, mint a Tömb lista
- keretrendszer - Tömb lista a Gyűjtemények keretrendszer része, és a JDK 1.2-ben vezették be. Közben, Vektor a Java korábbi verzióiban örökölt osztályként van jelen.
3. Vektor
Ahogy már van egy kibővített útmutatónk arrólTömb lista, itt nem tárgyaljuk az API-t és a képességeit. Másrészt bemutatunk néhány alapvető részletet Vektor.
Egyszerűen fogalmazva, a Vektor egy átméretezhető tömb. Az elemek hozzáadásával vagy eltávolításával nőhet és zsugorodhat.
Készíthetünk egy vektort tipikus módon:
Vektor vektor = új Vektor ();
Az alapértelmezett konstruktor üreset hoz létre Vektor 10 kezdeti kapacitással.
Adjunk hozzá néhány értéket:
vector.add ("baeldung"); vector.add ("Vektor"); vector.add ("példa");
Végül ismételjük az értékeket a Iterátor felület:
Iterátor iterátor = vektor.iterátor (); while (iterator.hasNext ()) {String elem = iterator.next (); // ...}
Vagy áthaladhatunk a Vektor felhasználásával Felsorolás:
E = vektor.elemek (); while (e.hasMoreElements ()) {String elem = e.nextElement (); // ...}
Most vizsgáljuk meg alaposabban néhány egyedi tulajdonságukat.
4. Egyidejűség
Ezt már említettük Tömb lista és Vektor különböznek a párhuzamossági stratégiájukban, de nézzük meg közelebbről. Ha belemerülnénk Vektor módszer aláírásaival látnánk, hogy mindegyiknek van szinkronizált kulcsszava:
nyilvános szinkronizált E get (int index)
Egyszerűen fogalmazva, ez azt jelenti, hogy egy adott vektorhoz egyszerre csak egy szál férhet hozzá.
Valójában azonban ezt a műveleti szintű szinkronizálást mindenképpen át kell fedni a saját szinkronizálásunkkal az összetett műveletekhez.
Tehát ezzel szemben Tömb lista más megközelítést alkalmaz. Módszerei az nem szinkronizálva van, és ez az aggodalom osztályokra van különítve, amelyeket a párhuzamosságnak szentelnek.
Például használhatjuk CopyOnWriteArrayList vagy Collections.synchronizedList hogy hasonló hatást érjen el Vektor:
vector.get (1); // szinkronizált gyűjtemények.synchronizedList (arrayList) .get (1); // szinkronizálva is
5. Teljesítmény
Amint azt már fentebb tárgyaltuk, Vektor szinkronizálva van, amely közvetlen hatást gyakorol a teljesítményre.
A teljesítménybeli különbség megtekintéséhez Vektor ellen Tömb lista írjunk egy egyszerű JMH benchmark tesztet.
A múltban megvizsgáltuk az idő összetettségét Tömb listaMűveleteit, adjuk hozzá a Vektor.
Első, teszteljük a kap() módszer:
@Benchmark public Employee testGet (ArrayListBenchmark.MyState state) {return state.employeeList.get (state.employeeIndex); } @Benchmark public Employee testVectorGet (ArrayListBenchmark.MyState state) {return state.employeeVector.get (state.employeeIndex); }
A JMH-t három szál és 10 bemelegítő iteráció használatára konfiguráljuk.
És számoljunk be a műveletenkénti átlagos időtartamról nanoszekundum szinten:
Benchmark Mode Cnt Score Hibaegységek ArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns / op ArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns / op
Ezt láthatjuk ArrayList # get körülbelül háromszor gyorsabban működik, mint # # Kap.
Most hasonlítsuk össze a tartalmaz () művelet:
@Benchmark nyilvános logikai tesztContains (ArrayListBenchmark.MyState state) {return state.employeeList.contains (state.employee); } @Benchmark nyilvános logikai tesztContainsVector (ArrayListBenchmark.MyState state) {return state.employeeVector.contains (state.employee); }
És nyomtassa ki az eredményeket:
Benchmark Mode Cnt Pontszám Hibaegységek ArrayListBenchmark.test 20-as átlagot tartalmaz 8,665 ± 1,159 ns / op ArrayListBenchmark.testContainsVector átlag 20 36,513 ± 1,266 ns / op
Mint láthatjuk, a tartalmaz () művelet, a teljesítmény ideje Vektor sokkal hosszabb, mint Tömb lista.
6. Összefoglalás
Ebben a cikkben megvizsgáltuk a Vektor és Tömb lista osztályok Java-ban. Emellett bemutattuk Vektor funkciók részletesebben.
Szokás szerint a cikk teljes kódja elérhető a GitHubon.