Jakie są różnice między ArrayList i Vector?

352

Jakie są różnice między dwiema strukturami danych ArrayList i Vector i gdzie należy użyć każdej z nich?

KushalP
źródło
5
Nie widzę tutaj dokładnego duplikatu.
Jeff Atwood,
2
Możesz również tworzyć wektory w Javie - Vector v = new Vector(3, 2);
sgsi
Nigdy nie należy używać Vector, użycie ArrayListlub LinkedListlubArrayDeque

Odpowiedzi:

365

Różnice

  • Wektory są synchronizowane, ArrayLists nie.
  • Metody wzrostu danych

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.

Odniesienie

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.

Odniesienie

Sev
źródło
7
@Rei Dokładnie to, co powiedział: wiele wątków ( docs.oracle.com/javase/tutorial/essential/concurrency/... )
RecursiveExceptionException
Co powiesz na CZYTANIE z ArrayList w sposób wielowątkowy? Czy to jest bezpieczne dla wątków?
Xunie,
@Xunie Reading z ArrayList lub innych klas kolekcji nigdy nie będzie problemem. Problem pojawia się podczas dodawania, usuwania lub modyfikowania istniejących wartości do ArrayList lub kolekcji.
sainath reddy
85

Jak wynika z dokumentacji, a Vectori an ArrayListsą prawie równoważne. Różnica polega na tym, że dostęp do a Vectorjest zsynchronizowany, podczas gdy dostęp do a ArrayListnie. Oznacza to, że tylko jeden wątek może wywoływać metody Vectornaraz, 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.synchronizedListfunkcja, aby utworzyć zsynchronizowaną listę, dzięki czemu uzyskasz odpowiednik Vector.

Antal Spector-Zabusky
źródło
53

Vectorto 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.

Czeski
źródło
10
zsynchronizowane, ale nie wątkowo bezpieczne? co to znaczy? [Jestem początkujący]
Dineshkumar
13
@Dineshkumar Vectormiał 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.
Czeski
1
@Dineshkumar zobacz to pytanie
czeski
3
@Dineshkumar przepraszam - to nie był dobry link. oto ostateczna odpowiedź . Krótko mówiąc, jego synchronizacja jest bezużyteczna.
Bohemian
7
Ciekawostka: Stack Java1.7 korzysta z klasy Vector.
Tobi,
26

ArrayList jest nowszy i 20-30% szybszy.

Jeśli nie potrzebujesz czegoś wyraźnie widocznego Vector, użyjArrayList

Oli
źródło
32
Czy możesz poprzeć roszczenie, przedstawiając dowód 20-30% faster?
użytkownik
5
@ użytkownik W tym czasie było to tylko osobiste doświadczenie z brzęczenia, które wywołują ogromne tablice. Od ponad trzech lat nie mogę wskazać ci dokładnie tego, o czym mówiłem, ale istnieje wiele testów porównawczych. Największe skoki pojawiają się dopiero w wątku,
Oli
Dopasowanie tylko 20-30%, jeśli czytasz ORAZ piszesz do Vector / Arraylist, ponieważ funkcja wzrostu wywrze największy wpływ. Jeśli masz test porównawczy, który pisze tylko raz, a następnie wykonuje tylko odczyt, przyniesie inny wynik
Tobi
2
Proszę przedstawić dowód na swoje dane
znak przewodowy
Ponieważ wektor jest zsynchronizowany, a arraylist nie jest zsynchronizowany, może to być powód, dlatego arraylist jest szybszy niż wektor.
ZAPYTAJ
23

Istnieją 2 główne różnice między Vector a ArrayList.

  1. 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.

  2. 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:

  1. Aby uzyskać element w określonej lokalizacji z Vectora, używamy funkcji elementAt (int index). Ta nazwa funkcji jest bardzo długa. Zamiast tego w ArrayList otrzymujemy (indeks wewnętrzny), który jest bardzo łatwy do zapamiętania i użycia.
  2. Podobnie, aby zastąpić istniejący element nowym elementem w Vector, używamy metody setElementAt (), która również jest bardzo długa i może drażnić programistę przed wielokrotnym użyciem. Zamiast tego ArrayList ma metodę add (int index, object), która jest łatwa w użyciu i zapamiętywaniu. W ten sposób mają bardziej przyjazne dla programisty i łatwe w użyciu nazwy funkcji w ArrayList.

Kiedy stosować który?

  1. Staraj się całkowicie unikać używania wektorów. ArrayLists może robić wszystko, co potrafi Vector. Więcej niż ArrayLists domyślnie nie są synchronizowane. Jeśli chcesz, możesz zsynchronizować go w dowolnym momencie, korzystając z klasy util Collection.
  2. ArrayList ma łatwe do zapamiętania i używania nazwy funkcji.

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.

użytkownik1923551
źródło
5
Błędne informacje (włączone) na temat wzrostu rozmiaru dla ArrayLIst i Vector, w przeciwnym razie całkiem dobra odpowiedź.
Nenad Bulatovic
Rozwój Vectora podwaja się z potrzebnymi docs.oracle.com/javase/7/docs/api/java/util/Vector.html podczas ArrayList „Szczegóły polityki wzrostu nie są określone poza faktem, że dodanie elementu ma stały zamortyzowany koszt czasu. ” docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib
Nie rozumiem, w jaki sposób nazwa metody może być kryterium używania lub nieużywania tej metody.
Surender Kherwa
14

ArrayListi Vectoroba implementują interfejs listy i zachowują kolejność wstawiania. Ale istnieje wiele różnic między klasami ArrayListi Vector...

ArrayList -

  1. ArrayList nie jest zsynchronizowany.
  2. ArrayList zwiększa 50% aktualnego rozmiaru tablicy, jeśli liczba elementów przekroczy jego pojemność.
  3. ArrayList nie jest klasą starszą, jest wprowadzony w JDK 1.2.
  4. ArrayList jest szybki, ponieważ nie jest zsynchronizowany.
  5. ArrayList używa interfejsu Iterator do przechodzenia między elementami.

Wektor -

  1. Vector jest zsynchronizowany.
  2. Vector przyrost 100% oznacza podwojenie rozmiaru tablicy, jeśli całkowita liczba elementów przekroczy pojemność.
  3. Vector jest klasą starszą.

  4. 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.

  5. Vectoruż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

roottraveller
źródło
10

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: wprowadź opis zdjęcia tutaj

subhashi
źródło
1
Dlaczego dodawanie obiektu na początku, a na końcu w LinkedList jest powolne? Czy nie powinno być szybsze niż OBA tablica i wektor?
CHANist
@CHANist Też się zgadzam. Dodawanie obiektu na początku i na końcu powinno być szybsze niż dodawanie obiektu na jego środku.
Rahul Rastogi
1
Język używany w kolumnie LinkedList tej tabeli jest sprzeczny. Zarówno poprzedzanie, jak i dołączanie do LinkedList jest szybsze niż dodawanie elementów w środku, ale wolniejsze niż dodawanie lub dołączanie do ArrayLists lub wektorów. Wynika to z faktu, że każde wstawienie wymaga alokacji pamięci z referencjami nielokalnymi, co zwiększa ryzyko pominięcia pamięci podręcznej. Chociaż wyszukiwanie w LinkedList jest liniowe z liczbą elementów, a wskaźnik do końca nie jest przechowywany, dołączanie jest nadal szybsze niż dodawanie, ponieważ pamięć jest przydzielana tylko dla jednego elementu.
Sophia Gold