Jakie są różnice między dwiema strukturami danych ArrayList i Vector i gdzie należy użyć każdej z nich?
Vector v = new Vector(3, 2);
Jakie są różnice między dwiema strukturami danych ArrayList i Vector i gdzie należy użyć każdej z nich?
Vector v = new Vector(3, 2);
Odpowiedzi:
Różnice
Użyj ArrayLists, jeśli nie ma szczególnych wymagań dotyczących używania wektorów.
Synchronizacja
Jeśli wiele wątków jednocześnie uzyskuje dostęp do ArrayList, musimy zsynchronizować zewnętrznie blok kodu, który modyfikuje listę strukturalnie lub po prostu modyfikuje element. Modyfikacja strukturalna oznacza dodanie lub usunięcie elementu (ów) z listy. Ustawienie wartości istniejącego elementu nie jest modyfikacją konstrukcyjną.
Collections.synchronizedList
jest zwykle używany w momencie tworzenia listy, aby uniknąć przypadkowego niezsynchronizowanego dostępu do listy.
Wzrost danych
Wewnętrznie zarówno ArrayList, jak i Vector trzymają swoją zawartość za pomocą Array. Gdy element zostanie wstawiony do ArrayList lub Vector, obiekt będzie musiał rozwinąć swoją wewnętrzną tablicę, jeśli zabraknie miejsca. Wektor domyślnie podwaja rozmiar swojej tablicy, podczas gdy ArrayList zwiększa rozmiar swojej tablicy o 50 procent.
Jak wynika z dokumentacji, a Vector
i an ArrayList
są prawie równoważne. Różnica polega na tym, że dostęp do a Vector
jest zsynchronizowany, podczas gdy dostęp do a ArrayList
nie. Oznacza to, że tylko jeden wątek może wywoływać metody Vector
naraz, a uzyskanie blokady jest niewielkie. jeśli używasz ArrayList
, tak nie jest. Ogólnie rzecz biorąc, będziesz chciał użyć ArrayList
; w przypadku jednowątkowym jest to lepszy wybór, aw przypadku wielowątkowym masz lepszą kontrolę nad blokowaniem. Chcesz zezwolić na jednoczesne odczyty? W porządku. Chcesz wykonać jedną synchronizację dla partii dziesięciu zapisów? Też dobrze. To wymaga od ciebie trochę więcej uwagi, ale prawdopodobnie jest to, czego chcesz. Pamiętaj również, że jeśli masz ArrayList, możesz użyćCollections.synchronizedList
funkcja, aby utworzyć zsynchronizowaną listę, dzięki czemu uzyskasz odpowiednik Vector
.
Vector
to zepsuta klasa, która nie jest bezpieczna dla wątków, mimo że jest „zsynchronizowana” i jest używana tylko przez studentów i innych niedoświadczonych programistów.
ArrayList
jest implementacją List Go-to używaną przez profesjonalistów i doświadczonych programistów.
Specjaliści, którzy chcą wdrożyć listę wątków, używają CopyOnWriteArrayList
.
Vector
miał być bezpieczny dla wątków , ale ma wadę projektową, która sprawia, że * w rzeczywistości nie jest bezpieczny dla wątków. Jest to w zasadzie przestarzała klasa. Z jakiegoś powodu uniwersytety itp. Nie słyszały o tych wiadomościach i nadal opowiadają się za ich wykorzystaniem.
ArrayList
jest nowszy i 20-30% szybszy.
Jeśli nie potrzebujesz czegoś wyraźnie widocznego Vector
, użyjArrayList
20-30% faster
?
Istnieją 2 główne różnice między Vector a ArrayList.
Wektor jest domyślnie synchronizowany, a ArrayList nie. Uwaga: można także zsynchronizować ArrayList, przekazując obiekt arraylist do metody Collections.synchronizedList (). Zsynchronizowane oznacza: można go używać z wieloma wątkami bez żadnych skutków ubocznych.
ArrayLists powiększa się o 50% poprzedniego rozmiaru, gdy miejsce nie jest wystarczające dla nowego elementu, gdzie Vector wzrośnie o 100% poprzedniego rozmiaru, gdy nie będzie miejsca na nowy element przychodzący.
Oprócz tego istnieją pewne praktyczne różnice między nimi pod względem nakładów programistycznych:
Kiedy stosować który?
Uwaga : mimo że arraylist rośnie o 100%, można tego uniknąć, zapewniając metodęcapacity (), aby upewnić się, że alokujesz wystarczającą ilość pamięci na samym etapie początkowym.
Mam nadzieję, że to pomoże.
ArrayList
i Vector
oba implementują interfejs listy i zachowują kolejność wstawiania. Ale istnieje wiele różnic między klasami ArrayList
i Vector
...
ArrayList
nie jest zsynchronizowany.ArrayList
zwiększa 50% aktualnego rozmiaru tablicy, jeśli liczba elementów przekroczy jego pojemność.ArrayList
nie jest klasą starszą, jest wprowadzony w JDK 1.2.ArrayList
jest szybki, ponieważ nie jest zsynchronizowany.ArrayList
używa interfejsu Iterator do przechodzenia między elementami.Wektor -
Vector
jest zsynchronizowany.Vector
przyrost 100% oznacza podwojenie rozmiaru tablicy, jeśli całkowita liczba elementów przekroczy pojemność.Vector
jest klasą starszą.
Vector
jest powolny, ponieważ jest zsynchronizowany, tj. w środowisku wielowątkowym, utrzyma inne wątki w stanie wykonalnym lub nie uruchomionym, dopóki bieżący wątek nie zwolni blokady obiektu.
Vector
używa interfejsu wyliczenia do przechodzenia między elementami. Ale może również używać Iteratora.
Zobacz także: https://www.javatpoint.com/difference-between-arraylist-and-vector
Zasadniczo zarówno ArrayList, jak i Vector używają wewnętrznej tablicy obiektów.
ArrayList: Klasa ArrayList rozszerza AbstractList i implementuje interfejs List oraz RandomAccess (interfejs znaczników). ArrayList obsługuje dynamiczne tablice, które mogą rosnąć w miarę potrzeb. To daje nam pierwszą iterację po elementach. ArrayList używa wewnętrznego Array Object; są one tworzone z domyślnym rozmiarem początkowym 10. Po przekroczeniu tego rozmiaru kolekcja jest automatycznie zwiększana do połowy domyślnego rozmiaru, czyli 15.
Wektor: Wektor jest podobny do ArrayList, ale różnice są takie, że jest zsynchronizowany, a jego domyślny rozmiar początkowy wynosi 10, a gdy rozmiar przekroczy jego rozmiar, zwiększa się dwukrotnie do pierwotnego rozmiaru, co oznacza, że nowy rozmiar będzie wynosił 20. Wektor jest jedyną klasą inne niż ArrayList do wdrożenia RandomAccess. Wektor ma czterech konstruktorów, z czego jeden bierze dwa parametry Wektor (int initialCapacity, int capacityIncrement) pojemnośćInkrecja to kwota, o którą pojemność jest zwiększana, gdy wektor się przepełnia, więc ma większą kontrolę nad współczynnikiem obciążenia.
Niektóre inne różnice to: