Каковы различия между ArrayList и Vector? - PullRequest
323 голосов
/ 07 июня 2010

В чем различия между двумя структурами данных ArrayList и Vector и где вы должны использовать каждую из них?

Ответы [ 7 ]

340 голосов
/ 07 июня 2010

Различия

  • Векторы синхронизированы, ArrayLists не.
  • Методы роста данных

Используйте ArrayLists, если нет особых требований к использованию Векторов.

Синхронизация

Если несколько потоков обращаются к ArrayList одновременно, мы должны внешне синхронизировать блок кода, который изменяет список либо структурно, либо просто изменяет элемент. Структурная модификация означает добавление или удаление элемента (ов) из списка. Установка значения существующего элемента не является структурной модификацией.

Collections.synchronizedList обычно используется во время создания списка, чтобы избежать случайного несинхронизированного доступа к списку.

Ссылка

Рост данных

Внутри ArrayList и Vector удерживают свое содержимое с помощью Array. Когда элемент вставляется в ArrayList или Vector, объект должен будет расширить свой внутренний массив, если ему не хватает места. Вектор по умолчанию удваивает размер своего массива, а ArrayList увеличивает размер массива на 50 процентов.

Ссылка

80 голосов
/ 07 июня 2010

Как сказано в документации, Vector и ArrayList почти эквивалентны. Разница в том, что доступ к Vector синхронизирован, а доступ к ArrayList - нет. Это означает, что только один поток может вызывать методы для Vector одновременно, и есть небольшая нагрузка при получении блокировки; если вы используете ArrayList, это не так. Как правило, вы хотите использовать ArrayList; в однопоточном случае это лучший выбор, а в многопоточном случае вы получаете лучший контроль над блокировкой. Хотите разрешить одновременное чтение? Хорошо. Хотите выполнить одну синхронизацию для партии из десяти записей? Тоже все в порядке. Это требует немного большей заботы с вашей стороны, но это, вероятно, то, что вы хотите. Также обратите внимание, что если у вас есть ArrayList, вы можете использовать функцию Collections.synchronizedList для создания синхронизированного списка, таким образом, вы получите эквивалент Vector.

45 голосов
/ 25 мая 2013

Vector - это неработающий класс, который не потокобезопасен, несмотря на то, что он «синхронизирован» и только используется студентами и другими неопытными программистами.

ArrayList - это реализация списка, используемая профессионалами и опытными программистами.

Профессионалы, которым нужна реализация списка с поддержкой многопоточности, используют CopyOnWriteArrayList.

26 голосов
/ 07 июня 2010

ArrayList новее и на 20-30% быстрее.

Если вам не нужно что-то явно явное в Vector, используйте ArrayList

22 голосов
/ 11 декабря 2013

Существует 2 основных различия между Vector и ArrayList.

  1. Вектор синхронизирован по умолчанию, а ArrayList - нет. Примечание. ArrayList также можно синхронизировать, передав объект arraylist в метод Collections.synchronizedList (). Синхронизированное средство: его можно использовать с несколькими потоками без каких-либо побочных эффектов.

  2. ArrayLists увеличиваются на 50% по сравнению с предыдущим размером, когда места недостаточно для нового элемента, тогда как вектор будет увеличиваться на 100% по сравнению с предыдущим размером, когда для нового входящего элемента нет места.

Кроме этого, между ними есть некоторые практические различия в плане программирования:

  1. Чтобы получить элемент в определенном месте из Vector, мы используем функцию elementAt (int index). Имя этой функции очень длинное. Вместо этого в ArrayList у нас есть get (int index), что очень легко запомнить и использовать.
  2. Аналогично, чтобы заменить существующий элемент новым элементом в Vector, мы используем метод setElementAt (), который снова очень длинный и может раздражать программиста для повторного использования. Вместо этого ArrayList есть метод add (int index, object), который легко использовать и запоминать. Таким образом, они имеют более дружественный к программисту и простой в использовании имена функций в ArrayList.

Когда использовать какой?

  1. Старайтесь избегать использования Векторов полностью. ArrayLists могут делать все то же, что и вектор. Более того, ArrayLists по умолчанию не синхронизированы. При желании вы можете синхронизировать его в любое время, используя класс утилит Collections.
  2. ArrayList позволяет легко запомнить и использовать имена функций.

Примечание : несмотря на то, что arraylist увеличивается на 100%, вы можете избежать этого с помощью метода surecapacity (), чтобы убедиться, что вы выделяете достаточно памяти на начальных этапах.

Надеюсь, это поможет.

13 голосов
/ 13 октября 2016

ArrayList и Vector оба реализуют интерфейс List и поддерживают порядок вставки. Но есть много различий между ArrayList и Vector классами ...

ArrayList -

  1. ArrayList не синхронизирован.
  2. ArrayList увеличивает на 50% размер текущего массива, если число элементов превышает его емкость.
  3. ArrayList не является унаследованным классом, он представлен в JDK 1.2.
  4. ArrayList быстрый, потому что он не синхронизирован.
  5. ArrayList использует интерфейс итераторапройти через элементы.

Вектор -

Vector синхронизируется. Vector увеличивает на 100%, что означает удвоение размера массива, если общее число элементов превышает его емкость.

Vectorунаследованный класс.

Vector работает медленно, поскольку он синхронизирован, т. е. в многопоточной среде он будет удерживать другие потоки в работоспособном или неработоспособном состоянии, пока текущий поток не снимет блокировку объекта.

Vector использует интерфейс Перечисления для прохождения элементов.Но он также может использовать Iterator.

См. Также: https://www.javatpoint.com/difference-between-arraylist-and-vector

10 голосов
/ 20 ноября 2013

В основном и ArrayList, и Vector используют внутренний объектный массив.

ArrayList: Класс ArrayList расширяет AbstractList и реализует интерфейс List и RandomAccess (интерфейс маркера).ArrayList поддерживает динамические массивы, которые могут расти по мере необходимости.Это дает нам первую итерацию по элементам.ArrayList использует внутренний объект Array;они создаются с начальным размером по умолчанию, равным 10. При превышении этого размера коллекция автоматически увеличивается до половины размера по умолчанию, равного 15.

Вектор: Вектор аналогиченArrayList, но различия в том, что он синхронизируется, и его начальный размер по умолчанию равен 10, а когда размер превышает его размер, увеличивается вдвое по сравнению с исходным размером, что означает, что новый размер будет 20. Вектор - единственный класс, кроме ArrayList, для реализации RandomAccess.,В Vector есть четыре конструктора, из которых один принимает два параметра Vector (int initialCapacity, intacityIncrement) acityIncrement - это величина, на которую увеличивается емкость при переполнении вектора, поэтому он имеет больший контроль над коэффициентом загрузки.

Некоторые другие различия: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...