Różnica między ArrayList a Vector w Javie
ArrayList i vector używają wewnętrznie Array jako struktury danych. Istnieje jednak kilka różnic w sposobie przechowywania i przetwarzania danych. W tym poście omówimy różnicę i podobieństwa między ArrayList i Vector.
ArrayList Vs Vector:
1) Synchronizacja: ArrayList nie jest zsynchronizowany, co oznacza, że wiele wątków może pracować na ArrayList w tym samym czasie. Dla np. jeśli jeden wątek wykonuje operację dodawania na ArrayList, może istnieć inny wątek wykonujący operację usuwania na ArrayList w tym samym czasie w środowisku wielowątkowym
, gdy Vector jest zsynchronizowany. Oznacza to, że jeśli jeden wątek działa na Vector, żaden inny wątek nie może go utrzymać. W przeciwieństwie do ArrayList, tylko jeden wątek może wykonać operację na wektorze naraz.
2) Zmiana rozmiaru: 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ę jego rozmiaru po zmianie rozmiaru, podczas gdy Vector podwaja Rozmiar siebie domyślnie, gdy rośnie.
3) Wydajność: ArrayList zapewnia lepszą wydajność, ponieważ nie jest zsynchronizowany. Operacje wektorowe dają słabą wydajność, ponieważ są bezpieczne dla gwintów, wątek, który działa na wektorze, otrzymuje blokadę, która sprawia, że inny wątek czeka na zwolnienie blokady.
4) fail-fast: najpierw wyjaśnię, co to jest fail-fast: Jeśli kolekcja (ArrayList, vector itp.) zostanie strukturalnie zmodyfikowana w jakikolwiek sposób, 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 Fail-fast. Z drugiej strony iterator i listIterator zwracane przez ArrayList są awaryjne.
5) kto tak naprawdę należy do collection framework? Wektor nie był częścią struktury zbiorów, został włączony do zbiorów później. Można go uznać za Legacy kod. Nie ma nic o wektorze, czego Kolekcja List nie może zrobić. Dlatego należy unikać wektora. Jeśli istnieje potrzeba działania bezpiecznego dla wątków, wykonaj ArrayList zsynchronizowany, jak omówiono w następnej sekcji tego posta lub użyj CopyOnWriteArrayList, który jest bezpieczną dla wątków odmianą 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) są awaryjne.
- obie są uporządkowanymi klasami kolekcji, ponieważ utrzymują kolejność wstawiania elementów.
- Wektor & ArrayList pozwala zarówno na duplikaty, jak i null wartości.
- oba rosną i kurczą się automatycznie po przepełnieniu i usunięciu.
kiedy używać ArrayList, a kiedy Vector?
to całkowicie zależy od wymagań. Jeśli istnieje potrzeba wykonania operacji „thread-safe”, wektor jest najlepszym rozwiązaniem, ponieważ zapewnia dostęp tylko do jednego wątku naraz.
wydajność: zsynchronizowane operacje zużywają więcej czasu w porównaniu do niezsynchronizowanych, więc jeśli nie ma potrzeby bezpiecznej pracy wątku, ArrayList jest lepszym wyborem, ponieważ wydajność zostanie poprawiona ze względu na współbieżne procesy.
jak zrobić synchronizację ArrayList?
jak stwierdziłem powyżej metody ArrayList nie są zsynchronizowane, ale nadal jeśli istnieje potrzeba, możesz je zsynchronizować w ten sposób –
//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(); ...}