Rozdíl mezi ArrayList a Vector v Javě
ArrayList a Vector oba používají pole jako datovou strukturu interně. Existuje však jen málo rozdílů ve způsobu ukládání a zpracování dat. V tomto příspěvku budeme diskutovat o rozdílech a podobnostech mezi ArrayList a Vector.
ArrayList Vs Vector:
1) synchronizace: ArrayList není synchronizován, což znamená, že více vláken může pracovat na Arraylistu současně. Například pokud jeden podproces provádí přidejte provozu na ArrayList, tam může být jiný podproces provádění odstranit provoz na ArrayList ve stejnou dobu v prostředí s více podprocesy
zatímco Vektor je synchronizován. To znamená, že pokud jedno vlákno pracuje na vektoru, žádné jiné vlákno se ho nemůže zmocnit. Na rozdíl od Arraylistu může na vektoru provádět operaci najednou pouze jedno vlákno.
2) Velikost: Jak ArrayList a Vektor může růst a zmenšovat se dynamicky udržovat optimální využití úložiště, nicméně způsob jejich velikost je odlišná. ArrayList rostou o polovinu své velikosti při změně velikosti, zatímco Vector zdvojnásobuje velikost sebe sama ve výchozím nastavení, když roste.
3) Výkon: ArrayList poskytuje lepší výkon, protože není synchronizován. Vektorové operace dává špatný výkon jako jsou thread-safe, nit, která funguje na Vektorové dostane zámek na to, který dělá jiné vlákno čekat, dokud se zámek neuvolní.
4) fail-fast: nejprve mi dovolte vysvětlit, co je fail-fast: Pokud se kolekce (ArrayList, vector atd.) strukturálně změní jakýmkoli způsobem, kromě metod přidání nebo odebrání iterátoru, po vytvoření iterátoru bude iterátor házet ConcurrentModificationException
. Strukturální modifikace se týká přidání nebo odstranění prvků ze sbírky.
podle vektorového javadoc není výčet vrácený vektorem rychlý. Na druhé straně iterátor a listIterator vrácené ArrayList jsou fail-fast.
5) kdo skutečně patří do kolekce framework? Vektor nebyl součástí kolekce framework, byl zařazen do sbírek později. To může být považováno za starší kód. Na vektoru není nic, co by sbírka seznamů nemohla udělat. Proto je třeba se vyhnout vektoru. Pokud je potřeba závitu-bezpečný provoz, aby ArrayList synchronizovány, jak je popsáno v další části tohoto příspěvku, nebo použít CopyOnWriteArrayList, která je thread-safe varianta ArrayList.
Existuje jen málo podobnosti mezi těmito třídami, které jsou následující:
- Oba Vektoru a ArrayList použití growable pole datové struktury.
- iterátor a listIterator vrácené těmito třídami (vektor a ArrayList) jsou fail-fast.
- oba jsou řazeny třídy kolekce, protože udržují pořadí vkládání prvků.
- vektor & ArrayList umožňuje duplicitní i nulové hodnoty.
- oba rostou a zmenšují se automaticky, když dojde k přetečení a vymazání.
kdy použít ArrayList a kdy použít vector?
to zcela závisí na požadavku. Pokud je potřeba provést „thread-safe“ operace vektor je vaše nejlepší sázka, protože zajišťuje, že pouze jedno vlákno přistupovat sbírku najednou.
Výkon: Synchronizované operace spotřebuje více času ve srovnání s non-synchronizované ty, takže pokud není potřeba nit bezpečný provoz, ArrayList je lepší volbou, neboť výkon bude lepší, protože souběžné procesy.
jak provést synchronizaci Arraylistu?
jak jsem uvedl výše ArrayList metody jsou nesynchronizované, ale přesto, pokud je potřeba, můžete je synchronizovat takto –
//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}