Přehled
V tomto tutoriálu, budeme se soustředit na rozdíly mezi ArrayList a Vektor tříd. Oba patří do rámce Java Collections Framework a implementují java.util.Seznam rozhraní.
tyto třídy však mají významné rozdíly ve svých implementacích.
co je jinak?
jako rychlý start představme klíčové rozdíly Arraylistu a vektoru. Poté budeme podrobněji diskutovat o některých bodech:
- synchronizace-první hlavní rozdíl mezi těmito dvěma. Vektor je synchronizován a ArrayList není.
- růst velikosti-další rozdíl mezi nimi je způsob, jakým se mění velikost při dosažení své kapacity. Vektor zdvojnásobí svou velikost. Naproti tomu ArrayList se zvětšuje pouze o polovinu své délky
- iterace – a Vector může použít iterátor a výčet k procházení prvků. Na druhou stranu, ArrayList může používat pouze Iterator.
- výkon-z velké části díky synchronizaci jsou vektorové operace pomalejší ve srovnání s rámcem ArrayList
- – ArrayList je také součástí rámce Collections a byl zaveden v JDK 1.2. Mezitím je vektor přítomen v dřívějších verzích Javy jako starší třída.
Vector
protože již máme rozšířenou příručku o Arraylistu, nebudeme zde diskutovat o jeho API a možnostech. Na druhou stranu představíme některé základní podrobnosti o vektoru.
jednoduše řečeno, vektor je proměnlivé pole. Při přidávání nebo odebírání prvků může růst a zmenšovat se.
můžeme vytvořit vektor typickým způsobem:
Vector<String> vector = new Vector<>();
výchozí konstruktor vytvoří prázdný vektor s počáteční kapacitou 10.
Pojďme přidat pár hodnot:
vector.add("baeldung");vector.add("Vector");vector.add("example");
A konečně, pojďme iterovat hodnoty pomocí rozhraní Iterator:
Iterator<String> iterator = vector.iterator();while (iterator.hasNext()) { String element = iterator.next(); // ...}
Nebo můžeme procházet Vektor pomocí Výčtu:
Enumeration e = vector.elements();while(e.hasMoreElements()) { String element = e.nextElement(); // ... }
Nyní, pojďme prozkoumat některé z jejich jedinečné vlastnosti do větší hloubky.
souběžnost
již jsme zmínili, že ArrayList a Vector se ve své strategii souběžnosti liší, ale podívejme se blíže. Když jsme se ponořit do Vektoru metoda podpisy, měli bychom vidět, že každý má synchronizované klíčového slova:
public synchronized E get(int index)
Jednoduše řečeno, to znamená, že pouze jedno vlákno může přistupovat k danému vektoru v čase.
ve skutečnosti však musí být tato synchronizace na úrovni operace stejně překryta naší vlastní synchronizací pro složené operace.
naproti tomu ArrayList zaujímá jiný přístup. Jeho metody nejsou synchronizovány a které se týkají oddělí do tříd, které jsou věnovány souběžnosti.
můžeme například použít CopyOnWriteArrayList nebo sbírky.synchronizedList, aby si podobný účinek Vektor:
vector.get(1); // synchronizedCollections.synchronizedList(arrayList).get(1); // also synchronized
Výkon
Jak jsme již diskutovali výše, Vektor je synchronizován, které způsobuje přímý dopad na výkon.
Chcete-li vidět rozdíl výkonu mezi vektorovými a Arraylistovými operacemi, napište jednoduchý test jmh benchmark.
v minulosti jsme se zabývali časovou složitostí operací Arraylistu, takže přidáme testovací případy pro vektor.
nejprve si vyzkoušíme metodu get ():
@Benchmarkpublic Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex);}@Benchmarkpublic Employee testVectorGet(ArrayListBenchmark.MyState state) { return state.employeeVector.get(state.employeeIndex);}
nakonfigurujeme JMH tak, aby používal tři vlákna a 10 zahřívacích iterací.
a uveďme průměrný čas na operaci na úrovni nanosekund:
Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns/opArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns/op
vidíme, že ArrayList # get funguje asi třikrát rychleji než Vector#get.
nyní porovnejme výsledky operace obsahuje() :
@Benchmarkpublic boolean testContains(ArrayListBenchmark.MyState state) { return state.employeeList.contains(state.employee);}@Benchmarkpublic boolean testContainsVector(ArrayListBenchmark.MyState state) { return state.employeeVector.contains(state.employee);}
a vytiskněte výsledky:
Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testContains avgt 20 8.665 ± 1.159 ns/opArrayListBenchmark.testContainsVector avgt 20 36.513 ± 1.266 ns/op
jak vidíme, pro operaci obsahuje() je doba výkonu vektoru mnohem delší než ArrayList.
shrnutí
v tomto článku jsme se podívali na rozdíly mezi třídami Vector a ArrayList v Javě. Dále jsme také podrobněji představili vektorové funkce.
jako obvykle je kompletní kód pro tento článek k dispozici na Githubu.
začněte s Spring 5 a Spring Boot 2, prostřednictvím kurzu Learn Spring:
>> podívejte se na kurz