Java ArrayList vs Vector

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



+