Java ArrayList vs Vector

1. Prehľad

V tomto návode zameriame sa na rozdiely medzi ArrayList a Vektor triedy. Oba patria do rámca Java Collections Framework a implementujú java.util.List rozhranie.

Avšak tieto triedy majú výrazné rozdiely pri ich implementácii.

2. Čo sa líši?

Na úvod si predstavíme hlavné rozdiely ArrayList a Vektor. Potom si podrobnejšie povieme o niektorých bodoch:

  • synchronizácia - prvý hlavný rozdiel medzi týmito dvoma. Vektor je synchronizovaný a ArrayList nie je.
  • rast veľkosti - Ďalším rozdielom medzi nimi je spôsob zmeny veľkosti pri dosahovaní svojich kapacít. The Vektor zdvojnásobí svoju veľkosť. Naproti tomu ArrayList sa zväčšuje iba o polovicu svojej dĺžky
  • iterácia - A Vektor môcť použiť Iterátor a Vymenovanie prechádzať cez živly. Na druhej strane, ArrayList môže iba použiť Iterátor.
  • výkon - hlavne kvôli synchronizácii, Vektor operácie sú pomalšie v porovnaní s ArrayList
  • rámec - Tiež, ArrayList je súčasťou rámca Zbierky a bol predstavený v JDK 1.2. Medzitým Vektor je v starších verziách Java prítomný ako staršia trieda.

3. Vektor

Ako už máme rozšíreného sprievodcu oArrayList, nebudeme tu rozoberať jeho API a možnosti. Na druhej strane uvedieme niekoľko základných podrobností o Vektor.

Jednoducho povedané, a Vektor je veľkosť súboru, ktorý možno zmeniť. Pri pridávaní alebo odoberaní prvkov sa môže zväčšovať a zmenšovať.

Vektor môžeme vytvoriť typickým spôsobom:

Vektorový vektor = nový Vektor ();

Predvolený konštruktor vytvorí prázdny Vektor s počiatočnou kapacitou 10.

Pridajme niekoľko hodnôt:

vector.add ("baeldung"); vector.add ("Vektor"); vector.add ("príklad");

A nakoniec poďme iterovať cez hodnoty pomocou Iterátor rozhranie:

Iterátor iterátor = vector.iterator (); while (iterator.hasNext ()) {Reťazcový prvok = iterator.next (); // ...}

Alebo môžeme prekonať Vektor použitím Vymenovanie:

Výpočet e = vector.elements (); while (e.hasMoreElements ()) {Reťazcový prvok = e.nextElement (); // ...}

Teraz sa pozrime podrobnejšie na niektoré z ich jedinečných funkcií.

4. Súbežnosť

Už sme to spomínali ArrayList a Vektor sa líšia svojou stratégiou súbežnosti, ale pozrime sa bližšie. Keby sme sa mali do toho ponoriť Vektorové podpisy metód, videli by sme, že každý z nich má synchronizované kľúčové slovo:

verejné synchronizované E get (int index)

Jednoducho povedané, to znamená, že k danému vektoru môže naraz získať prístup iba jedno vlákno.

Naozaj je však potrebné túto synchronizáciu na úrovni operácií prekryť našou vlastnou synchronizáciou pre zložené operácie.

Takže na rozdiel od toho ArrayList zaujíma iný prístup. Jeho metódy sú nie synchronizované a táto obava je rozdelená do tried, ktoré sa venujú súbežnosti.

Napríklad môžeme použiť CopyOnWriteArrayList alebo Zbierky.synchronizovaný zoznam získať podobný efekt ako Vektor:

vector.get (1); // synchronizované Collections.synchronizedList (arrayList) .get (1); // tiež synchronizované

5. Výkon

Ako sme už diskutovali vyššie, Vektor je synchronizovaný, čo má priamy vplyv na výkon.

Ak chcete vidieť výkonnostný rozdiel medzi Vektor proti ArrayList operácie, napíšme jednoduchý benchmarkový test JMH.

V minulosti sme sa zaoberali časovou zložitosťou ArrayListOperácie, pridajme teda testovacie prípady pre Vektor.

najprv, otestujme dostať () metóda:

@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); }

Nakonfigurujeme JMH tak, aby používal tri vlákna a 10 zahrievacích iterácií.

A poďme podať správu o priemernom čase na operáciu na úrovni nanosekund:

Benchmark Mode Cnt Score Error Units ArrayListBenchmark.test Získať priemer 20 9 786 ± 1,358 ns / op ArrayListBenchmark.testVector Získať priemer 20 37 074 ± 3,469 ns / op

To vidíme ArrayList # dostať funguje asi trikrát rýchlejšie ako Vektor # dostať.

Teraz si porovnajme výsledky obsahuje () prevádzka:

@Benchmark public boolean testContains (ArrayListBenchmark.MyState state) {návrat state.employeeList.contains (state.employee); } @Benchmark public boolean testContainsVector (ArrayListBenchmark.MyState state) {return state.employeeVector.contains (state.employee); }

A výsledky vytlačte:

Benchmark Mode Cnt Score Error Units ArrayListBenchmark.testContains avgt 20 8.665 ± 1.159 ns / op ArrayListBenchmark.testContainsVector avgt 20 36.513 ± 1.266 ns / op

Ako vidíme, pre obsahuje () prevádzka, čas výkonu pre Vektor je oveľa dlhšia ako ArrayList.

6. Zhrnutie

V tomto článku sme sa pozreli na rozdiely medzi Vektor a ArrayList triedy v Jave. Dodatočne sme tiež predstavili Vektor funkcie podrobnejšie.

Úplný kód tohto článku je ako obvykle k dispozícii na serveri GitHub.


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