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.
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.
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.
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.
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.
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.
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:
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.
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?
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.
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.
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.
Vectorużywa interfejsu wyliczenia do przechodzenia między elementami. Ale może również używać Iteratora.
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.
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.
Vector v = new Vector(3, 2);
Vector
, użycieArrayList
lubLinkedList
lubArrayDeque
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.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
źródło
Jak wynika z dokumentacji, a
Vector
i anArrayList
są prawie równoważne. Różnica polega na tym, że dostęp do aVector
jest zsynchronizowany, podczas gdy dostęp do aArrayList
nie. Oznacza to, że tylko jeden wątek może wywoływać metodyVector
naraz, a uzyskanie blokady jest niewielkie. jeśli używaszArrayList
, 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 odpowiednikVector
.źródło
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
.źródło
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
źródło
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.
źródło
ArrayList
iVector
oba implementują interfejs listy i zachowują kolejność wstawiania. Ale istnieje wiele różnic między klasamiArrayList
iVector
...ArrayList -
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
źródło
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:
źródło