Java ArrayList vs Vector

1. Pregled

U ovom vodiču, usredotočit ćemo se na razlike između ArrayList i Vektor razreda. Oboje pripadaju Okviru Java Collections i implementiraju java.util.Popis sučelje.

Međutim, ove klase imaju značajne razlike u njihovim provedbama.

2. Što je drugačije?

Kao brzi početak, predstavimo ključne razlike u ArrayList i Vektor. Zatim ćemo detaljnije razgovarati o nekim točkama:

  • sinkronizacija - prva glavna razlika između ove dvije. Vektor je sinkroniziran i ArrayList nije.
  • rast veličine - Još jedna razlika između njih je način na koji mijenjaju veličinu dok dostižu svoj kapacitet. The Vektor udvostručuje svoju veličinu. U kontrastu, ArrayList povećava se samo za polovicu duljine
  • iteracija - I Vektor mogu koristiti Iterator i Nabrajanje prelaziti preko elemenata. S druge strane, ArrayList mogu samo koristiti Iterator.
  • performanse - uglavnom zbog sinkronizacije, Vektor operacije su sporije u usporedbi s ArrayList
  • framework - Također, ArrayList dio je okvira zbirki i uveden je u JDK 1.2. U međuvremenu, Vektor prisutan je u ranijim verzijama Jave kao naslijeđena klasa.

3. Vektor

Kao što već imamo prošireni vodič oArrayList, ovdje nećemo raspravljati o njegovom API-ju i mogućnostima. S druge strane, predstavit ćemo neke temeljne detalje o Vektor.

Jednostavno rečeno, a Vektor je promjenjivi niz. Može rasti i smanjivati ​​se dok dodajemo ili uklanjamo elemente.

Možemo stvoriti vektor na tipičan način:

Vektor vektora = novi Vektor ();

Zadani konstruktor stvara prazno Vektor s početnim kapacitetom od 10.

Dodajmo nekoliko vrijednosti:

vector.add ("baeldung"); vector.add ("Vektor"); vector.add ("primjer");

I na kraju, krenimo kroz vrijednosti koristeći Iterator sučelje:

Iterator iterator = vector.iterator (); while (iterator.hasNext ()) {String element = iterator.next (); // ...}

Ili možemo prijeći Vektor koristeći Nabrajanje:

Nabrajanje e = vector.elements (); while (e.hasMoreElements ()) {String element = e.nextElement (); // ...}

Ajmo sada dublje istražiti neke od njihovih jedinstvenih značajki.

4. Istodobnost

To smo već spomenuli ArrayList i Vektor se razlikuju u svojoj strategiji istodobnosti, ali pogledajmo ih bliže. Kad bismo zaronili Vektorski potpise metode, vidjeli bismo da svaki ima sinkroniziranu ključnu riječ:

javni sinkronizirani E get (int indeks)

Jednostavno rečeno, to znači da samo jedna nit može istodobno pristupiti danom vektoru.

Stvarno, međutim, ovu sinkronizaciju na operacijskoj razini ionako treba prekriti vlastitom sinkronizacijom za složene operacije.

Za razliku od toga, ArrayList zauzima drugačiji pristup. Njegove metode su ne sinkronizirano i ta je briga izdvojena u razrede koji su posvećeni istodobnosti.

Na primjer, možemo koristiti CopyOnWriteArrayList ili Zbirke.synchronizedList da bi se dobio sličan efekt Vektor:

vector.get (1); // sinkronizirane zbirke.synchronizedList (arrayList) .get (1); // također sinkronizirano

5. Izvedba

Kao što smo već gore raspravljali, Vektor je sinkroniziran što uzrokuje izravan utjecaj na performanse.

Da biste vidjeli razliku u izvedbi između Vektor protiv ArrayList operacije, napišimo jednostavan JMH benchmark test.

U prošlosti smo gledali vremensku složenost ArrayList, Pa dodajmo testove za Vektor.

Prvi, testirajmo dobiti() metoda:

@Benchmark javni zaposlenik testGet (ArrayListBenchmark.MyState state) {return state.employeeList.get (state.employeeIndex); } @Benchmark javni zaposlenik testVectorGet (ArrayListBenchmark.MyState state) {return state.employeeVector.get (state.employeeIndex); }

Konfigurirat ćemo JMH da koristi tri niti i 10 iteracija zagrijavanja.

I izvijestimo o prosječnom vremenu po operaciji na nanosekundi:

Benchmark Mode Cnt Rezultat Jedinice pogrešaka ArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns / op ArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns / op

To možemo vidjeti ArrayList # get radi otprilike tri puta brže od Vektor # get.

Sad, usporedimo rezultate sadrži () operacija:

@Benchmark javni logički testContains (ArrayListBenchmark.MyState state) {return state.employeeList.contains (state.employee); } @Benchmark javni logički testContainsVector (ArrayListBenchmark.MyState state) {return state.employeeVector.contains (state.employee); }

I ispišite rezultate:

Benchmark Mode Cnt Rezultat Jedinice pogrešaka ArrayListBenchmark.testSadrži prosjek 20 8.665 ± 1.159 ns / op ArrayListBenchmark.testContainsVector prosjek 20 36.513 ± 1.266 ns / op

Kao što vidimo, za sadrži () rad, vrijeme izvedbe za Vektor je mnogo dulje od ArrayList.

6. Sažetak

U ovom smo članku pogledali razlike između Vektor i ArrayList satovi na Javi. Pored toga, također smo predstavili Vektor značajke u više pojedinosti.

Kao i obično, cjeloviti kôd za ovaj članak dostupan je na GitHubu.