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.


$config[zx-auto] not found$config[zx-overlay] not found