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

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

Author: Draken, 2010-06-07

9 answers

Różnice

  • wektory są zsynchronizowane, ArrayLists nie są.
  • Metody Wzrostu Danych

Użyj ArrayLists, jeśli nie ma szczególnego wymogu używania wektorów.

Synchronizacja

Jeśli wiele wątków uzyskuje dostęp do ArrayList jednocześnie, musimy zewnętrznie zsynchronizować blok kodu, który modyfikuje listę strukturalnie lub po prostu modyfikuje element. Modyfikacja strukturalna oznacza dodanie lub usunięcie element(y) z listy. Ustawienie wartości istniejącego elementu nie jest modyfikacją strukturalną.

Collections.synchronizedList jest zwykle używany w momencie tworzenia listy, aby uniknąć przypadkowego niezsynchronizowanego dostępu do listy.

Numer referencyjny

Wzrost danych

Wewnętrznie, zarówno ArrayList, jak i Vector przechowują swoją zawartość za pomocą tablicy. Gdy element zostanie wstawiony do tablicy lub wektora, obiekt będzie musiał rozszerzyć swoją wewnętrzną tablicę jeśli zabraknie miejsca. wektor domyślnie podwaja rozmiar tablicy, podczas gdy ArrayList zwiększa rozmiar tablicy o 50 procent.

Numer referencyjny

 321
Author: Sev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 21:03:17

Jak mówi dokumentacja, a Vector oraz ArrayList są prawie równoważne. Różnica polega na tym, że dostęp do Vector jest zsynchronizowany, podczas gdy dostęp do ArrayList nie jest. Oznacza to, że tylko jeden wątek może wywoływać metody na Vector w tym samym czasie, i istnieje niewielki narzut w pozyskiwaniu blokady; jeśli używasz ArrayList, to tak nie jest. Ogólnie rzecz biorąc, będziesz chciał użyć ArrayList; w przypadku jednowątkowym jest to lepszy wybór, a w przypadku wielowątkowym, możesz uzyskaj lepszą kontrolę nad blokowaniem. Chcesz zezwolić na jednoczesne odczyty? Dobrze. Chcesz wykonać jedną synchronizację dla partii dziesięciu zapisów? Też dobrze. To wymaga trochę więcej opieki po twojej stronie, ale to jest prawdopodobnie to, czego chcesz. Zauważ również, że jeśli masz ArrayList, możesz użyć Collections.synchronizedList funkcja do tworzenia zsynchronizowanej listy, dzięki czemu otrzymujesz odpowiednik Vector.

 77
Author: Antal Spector-Zabusky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-06 23:13:48

Vector jestzłamaną klasą, która jestnie threadsafe, mimo że jest "zsynchronizowana" i jesttylko używana przez uczniów i innych niedoświadczonych programistów.

ArrayList jest to implementacja go-to List używana przez profesjonalistów i doświadczonych programistów.

Profesjonaliści chcący implementację listy wątków używają CopyOnWriteArrayList.

 38
Author: Bohemian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:11

ArrayList jest nowszy i 20-30% szybszy.

Jeśli nie potrzebujesz czegoś wyraźnie widocznego w Vector, Użyj ArrayList

 24
Author: Oli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-06 23:13:22

Istnieją dwa główne różnice między wektorami i Arraylistami.

  1. Wektor jest domyślnie zsynchronizowany, a ArrayList nie. Uwaga: Możesz również zsynchronizować ArrayList przekazując obiekt arraylist do kolekcji.metoda synchronizedList (). Zsynchronizowany oznacza : może być używany z wieloma wątkami bez żadnego efektu ubocznego.

  2. ArrayLists rośnie o 50% poprzedniego rozmiaru, gdy przestrzeń nie jest wystarczająca dla nowego elementu, gdzie jako wektor będzie rośnie o 100% poprzedniego rozmiaru, gdy nie ma miejsca na nowy element przychodzący.

Poza tym, istnieją pewne praktyczne różnice między nimi, jeśli chodzi o wysiłek programistyczny:

  1. aby uzyskać element w określonym miejscu z wektora używamy funkcji elementAt (int index). Nazwa tej funkcji jest bardzo długa. W miejsce tego w ArrayList mamy get (int index) 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 jest ponownie bardzo długa i może irytować programistę do wielokrotnego używania. W miejsce tej ArrayList znajduje się metoda add (int index, object), która jest łatwa w użyciu i zapamiętaniu. W ten sposób mają bardziej przyjazne dla programistów i łatwe w użyciu nazwy funkcji w ArrayList.

Kiedy użyć którego?

  1. staraj się unikać używania wektorów całkowicie. ArrayLists może zrobić wszystko, co wektor może zrobić. Więcej na ArrayLists są domyślnie nie synchronizowane. Jeśli chcesz, możesz go zsynchronizować, kiedy tylko potrzebujesz, używając klasy Collections util.
  2. ArrayList ma łatwe do zapamiętania i użycia nazwy funkcji.

Notatka: mimo że arraylist rośnie o 100%, można tego uniknąć za pomocą metody ensurecapacity (), aby upewnić się, że przydzielasz wystarczającą ilość pamięci na początkowych etapach.

Mam nadzieję, że to pomoże.

 21
Author: user1923551,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 11:33:35

ArrayList i Vector implementuje interfejs listy i utrzymuje kolejność wstawiania.Istnieje jednak wiele różnic między klasami ArrayList i Vector...

ArrayList -

  1. ArrayList nie jest zsynchronizowany.
  2. ArrayList zwiększa o 50% bieżący rozmiar tablicy, jeśli liczba elementów przekracza jej pojemność.
  3. ArrayList nie jest klasą dziedziczoną, jest wprowadzona w JDK 1.2.
  4. ArrayList jest szybki, ponieważ nie jest zsynchronizowany.
  5. ArrayList wykorzystuje interfejs iteratora do przemierzania elementów.

Vector -

  1. Vector jest zsynchronizowany.
  2. Vector przyrost o 100% oznacza podwajanie rozmiaru tablicy, jeśli całkowita liczba elementów przekracza jej pojemność.
  3. Vector to klasy z przeszłości.

  4. Vector jest powolny, ponieważ jest zsynchronizowany, tzn. w środowisku wielowątkowym, utrzyma pozostałe wątki w stanie runnable lub non-runnable do momentu wydania bieżącego wątku zamek obiektu.

  5. Vector używa interfejsu wyliczania do przechodzenia elementów. Ale może również używać iteratora.

Zobacz też: https://www.javatpoint.com/difference-between-arraylist-and-vector

 10
Author: roottraveller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 09:14:24

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 znacznika). ArrayList obsługuje dynamiczne tablice, które mogą rosnąć w razie potrzeby. Daje nam pierwszą iterację nad elementami. ArrayList używa wewnętrznej tablicy obiektów; są one tworzone z domyślnym początkowym rozmiarem 10. Po przekroczeniu tego rozmiaru kolekcja jest automatycznie zwiększana do połowy domyślny rozmiar to 15.

Vector: Vector jest podobny do ArrayList, ale różnice są, jest zsynchronizowany i jego domyślny początkowy rozmiar jest 10, a gdy rozmiar przekracza jego rozmiar zwiększa się do dwukrotności oryginalnego rozmiaru, co oznacza, że nowy rozmiar będzie 20. Vector jest jedyną klasą inną niż ArrayList, która implementuje RandomAccess. Wektor ma cztery konstruktory z tego jeden przyjmuje dwa parametry Wektor (int initialCapacity, int capacityIncrement) capacityIncrement to kwota, o którą pojemność jest zwiększona, gdy wektor przepełnia się, więc ma większą kontrolę nad współczynnikiem obciążenia.

Niektóre inne różnice to: Tutaj wpisz opis obrazka

 9
Author: subhashis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 15:31:07

ArrayList Vs Vector:

1) Synchronizacja: ArrayList nie jest zsynchronizowana, co oznacza, że wiele wątków może pracować na ArrayList w tym samym czasie. Na przykład, jeśli jeden wątek wykonuje operację add na ArrayList, może być inny wątek wykonujący operację remove na ArrayList w tym samym czasie w środowisku wielowątkowym

Podczas gdy wektor jest zsynchronizowany. Oznacza to, że jeśli jeden wątek działa na Vector, żaden inny wątek nie może go złapać. W przeciwieństwie do ArrayList, tylko jeden wątek może wykonać operację na vector na raz.

2) Resize: zarówno ArrayList, jak i Vector mogą dynamicznie rosnąć i kurczyć się, aby utrzymać optymalne wykorzystanie pamięci masowej, jednak sposób ich zmiany rozmiaru jest inny. ArrayList rośnie o połowę swojego rozmiaru po zmianie rozmiaru, podczas gdy Vector podwaja swój rozmiar Domyślnie, gdy rośnie.

3) Wydajność: ArrayList daje lepszą wydajność, ponieważ nie jest zsynchronizowana. Operacje wektorowe dają słabą wydajność ponieważ są one bezpieczne dla wątku, wątek, który działa na Vector, otrzymuje blokadę, która sprawia, że inne wątki czekają aż blokada zostanie zwolniona.

4) Fail-fast: najpierw pozwól mi wyjaśnić, czym jest Fail-fast: jeśli kolekcja (ArrayList, vector itp.) zostanie strukturalnie zmodyfikowana za pomocą jakichkolwiek środków, z wyjątkiem metod add lub remove iteratora, po utworzeniu iteratora iterator wyrzuci ConcurrentModificationException. Modyfikacja strukturalna odnosi się do dodawania lub usuwania elementów z kolekcji.

Zgodnie z wektorem javadoc wyliczenie zwracane przez wektor nie jest szybkie. Z drugiej strony iterator i listIterator zwracane przez ArrayList są Fail-fast.

5) kto tak naprawdę należy do kolekcji framework? Wektor nie był częścią struktury zbiorów, został włączony do zbiorów później. Można go uznać za Kod Legacy. Nie ma nic o wektorze, czego kolekcja List nie może zrobić. Dlatego należy unikać wektora. Jeśli jest potrzeba thread-safe operacji zrobić ArrayList zsynchronizowane, jak omówiono w następnej sekcji tego postu lub użyć CopyOnWriteArrayList, który jest thread-safe wariant ArrayList.

Istnieje kilka podobieństw między tymi klasami, które są następujące:

Zarówno Vector jak i ArrayList używają growable array data structure. Iterator i listIterator zwracane przez te klasy (Vector i ArrayList) to fail-fast. Obie są klasami ordered collection, ponieważ zachowują kolejność wstawiania elementów. Vector & ArrayList both allows duplicate and null values. Zarówno rosną, jak i kurczą się automatycznie, gdy następuje przepełnienie i usunięcie.

 8
Author: Nishat Lakhani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 06:35:13
  1. Wektor jest domyślnie zsynchronizowany, a ArrayList nie. Uwaga: ty może również synchronizować ArrayList przekazując obiekt arraylist do Kolekcje.metoda synchronizedList (). Zsynchronizowany oznacza: może być używany z wieloma wątkami bez żadnego efektu ubocznego.

  2. ArrayLists rosną o 50% poprzedniego rozmiaru, gdy przestrzeń nie jest wystarczająca dla nowego elementu, gdzie jako wektor wzrośnie o 100% poprzedni rozmiar, gdy nie ma miejsca na nowe przychodzące element.

 1
Author: HeadAndTail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-13 13:55:21