Java Vector против ArrayList

В Java ArrayList и Vector оба реализуют интерфейс java.util.List и предоставляют возможность хранить и получать объекты с помощью простых методов API. Тем не менее, они во многих аспектах отличаются, и нам нужно подробно изучить оба класса, чтобы принять мудрое решение о том, когда использовать тот или иной класс.

1. Разница между ArrayList и Vector

1.1 Безопасность потока

Vector — это синхронизированная коллекция, а ArrayList — нет. Это просто означает, что при работе с параллельными приложениями мы можем использовать Vector без какого-либо дополнительного управления синхронизацией, реализованного разработчиком с помощью ключевого слова synchronized. Публичные методы внутри Vector определены как синхронизированные, что делает все операции в Vector безопасными для нужд параллелизма.

Чтобы использовать ArrayList в параллельных приложениях, мы должны явно контролировать доступ потока к экземпляру, чтобы приложение работало так, как задумано. Если мы хотим получить синхронизированную версию arraylist, то мы можем использовать метод Collections.synchronizedList().

Возвращаемый список — это внутренняя реализация интерфейса List, отличная от arraylist. Но он имеет те же возможности, что и класс arraylist.

ArrayList<String> namesList = new ArrayList<>();namesList.add("alex");namesList.add("brian");namesList.add("charles");namesList.add("david");//Synchronized listList<String> syncNamesList = Collections.synchronizedList(namesList);syncNamesList.add("edwin");System.out.println(syncNamesList);

1.2 Увеличение мощности

По умолчанию, когда вектору необходимо увеличить емкость для добавления элемента(когда существующая емкость заполнена), Vector увеличивает емкость на 100% во время изменения размера. Это означает, что размер вектора увеличивается вдвое от предыдущей емкости. Мы можем переопределить емкость по умолчанию с помощью конструктора Vector(int initialCapacity, int capacityIncrement). Здесь второй аргумент — это величина, на которую увеличивается емкость при переполнении вектора.

ArrayList, по умолчанию, емкость увеличивается на 50% от существующей емкости. В arraylist мы можем определить начальную емкость, но не коэффициент приращения емкости.

1.3.Производительность

Обе коллекции имеют резервный массив, в котором они хранят и ищут элементы. Так что, по сути, нет большой разницы в производительности в операциях добавления и получения.

Реальная разница в производительности проявляется, когда мы принимаем во внимание синхронизацию.

  • ArrayList не синхронизирован, поэтому нет никаких задержек в обеспечении безопасности потоков.
  • В то время как Vector синхронизирован, он имеет некоторые накладные расходы на управление потоками/блокировку и т. д.

1.4.Исключение ConcurrentModification

Есть одно различие в том, как эти коллекции обрабатывают итерацию, пока коллекция все еще модифицируется программой.

ArrayList предоставляет итераторы fail-fast. Как только мы изменим структуру arraylist(добавим или удалим элементы), итератор выдаст ошибку ConcurrentModificationException.

Вектор предоставляет итератор, а также перечисление. Итераторы быстры к сбоям, а перечисления — нет. Если мы изменим вектор во время итерации по перечислению, он не даст сбоя.

//VectorVector<String> vector = new Vector<>(Arrays.asList("A","B","C"));Enumeration<String> vectorEnums = vector.elements();while(vectorEnums.hasMoreElements()) {String value = vectorEnums.nextElement();if("B".equals(value)) {vector.add("D");}System.out.println(value);}System.out.println("================");//ArrayListArrayList<String> list = new ArrayList<>(Arrays.asList("A","B","C"));Iterator<String> listItr = list.iterator();while(listItr.hasNext()) {String value = listItr.next();if("B".equals(value)) {list.add("D");}System.out.println(value);}

Вывод программы.

ABCD================ABException in thread "main"java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at com.howtodoinjava.ArrayListExample.main(ArrayListExample.java:33)

2. Преобразование вектора в ArrayList

Чтобы преобразовать вектор, содержащий объекты, в ArrayList, содержащий аналогичные объекты, мы можем использовать конструктор ArrayList, который принимает другую коллекцию и инициализирует ArrayList элементами вектора.

Vector<String> vector = new Vector<>();vector.add("A");vector.add("B");vector.add("C");vector.add("D");ArrayList<String> arrayList = new ArrayList<>(vector); //[A, B, C, D]

3. Преобразование ArrayList в вектор

Преобразование из ArrayList в вектор очень похоже на предыдущий пример. Здесь нам нужно использовать конструктор Vector. Он принимает другую коллекцию и инициализирует вектор элементами ArrayList.

ArrayList<String> arrayList = new ArrayList<>();arrayList.add("A");arrayList.add("B");arrayList.add("C");arrayList.add("D");Vector<String> vector = new Vector<>(arrayList);

4. Заключение

В этом коротком руководстве по Java мы сравнили Vector с ArrayList. Обратите внимание, что начиная с платформы Java 2 v1.2 класс Vector был модернизирован для реализации интерфейса List. Если потокобезопасная реализация не требуется, рекомендуется использовать ArrayList вместо Vector.

Читать далее:

ArrayList Java Документация
Векторные документы Java

Прокрутить вверх