Каковы различия между ArrayList и Vector?

352

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

KushalP
источник
5
Я не вижу точного дубликата здесь.
Джефф Этвуд
2
Ну, вы можете создать векторы в Java , а также - Vector v = new Vector(3, 2);
sgsi
Никогда не используйте Vector, использование ArrayListили LinkedListилиArrayDeque

Ответы:

365

Различия

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

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

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

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

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

Ссылка

Рост данных

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

Ссылка

Sev
источник
7
@Rei Именно то, что он сказал: несколько потоков ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException
Как насчет READING из ArrayList в многопоточном режиме? Это потокобезопасно?
Xunie
@Xunie Чтение из ArrayList или других классов коллекций никогда не будет проблемой. Проблема возникает при добавлении, удалении или изменении существующих значений в ArrayList или коллекции.
Сайнат Редди
85

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

Антал Спектор-Забуский
источник
53

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

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

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

Богемский
источник
10
синхронизированы, но не безопасны? что это значит? [Я начинающий]
Динешкумар
13
@Dineshkumar Vectorбыл задуман как ориентированный на многопотоковое исполнение, но имеет конструктивный недостаток, который делает его * на самом деле не безопасным для работы с потоками. По сути, это устаревший класс. По некоторым причинам, университеты и т.д. не слышали об этой новости и все еще поддерживают ее использование.
Богемный
1
@Dineshkumar, посмотрите этот вопрос
Богемский
3
@Dineshkumar извините - это не очень хорошая ссылка. вот окончательный ответ . Короче, его синхронизация бесполезна.
Богемный
7
Интересный факт: стек Java1.7 использует класс Vector.
Тоби
26

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

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

Oli
источник
32
Можете ли вы поддержать иск, предоставив доказательства 20-30% faster?
пользователь
5
@user В то время это был просто личный опыт, когда ты копался в огромных массивах. Спустя три года я не могу точно указать, о чем я говорил, но есть множество ориентиров. Это не до тех пор, пока в потоке, где вы видите самые большие прыжки, но вот один: javacodegeeks.com/2010/08/…
Оли
20-30% совпадают, только если вы читаете И пишете в Vector / Arraylist, так как функция роста окажет наибольшее влияние. Если у вас есть тест, который пишет только один раз, а затем выполняет только чтение, вы получите другой результат
Тоби
2
Пожалуйста, предоставьте подтверждение ваших данных
wiredmark
Поскольку вектор синхронизирован, а arraylist не синхронизирован, это может быть причиной, arraylist быстрее, чем vector.
Спросите
23

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

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

  2. ArrayLists увеличиваются на 50% по сравнению с предыдущим размером, когда места недостаточно для нового элемента, тогда как Vector будет увеличиваться на 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 (), чтобы убедиться, что вы выделяете достаточно памяти на самих начальных этапах.

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

user1923551
источник
5
Неправильная информация (включена) о размере увеличения для ArrayLIst и Vector, в противном случае неплохой ответ.
Ненад Булатович
Рост вектора удваивается с необходимыми docs.oracle.com/javase/7/docs/api/java/util/Vector.html while ArrayList "Детали политики роста не указаны, кроме того факта, что добавление элемента имеет постоянные амортизированные затраты времени. " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Мохамед Эль-Накиб,
Я не понимаю, как имя метода может быть критерием для использования или не использования этого метода.
Сурендер Кхерва
14

ArrayListи Vectorоба реализует интерфейс списка и поддерживает вставку order.but Есть много различий между ArrayListи Vectorклассами ...

ArrayList -

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

Вектор -

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

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

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

Смотрите также: https://www.javatpoint.com/difference-between-arraylist-and-vector

roottraveller
источник
10

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

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

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

Некоторые другие различия: введите описание изображения здесь

subhashis
источник
1
Почему добавление объекта сначала и в конце в LinkedList происходит медленно? Разве это не должно быть быстрее, чем ОБРАТНЫЙ массив или вектор?
CHANist
@ CHANist Я тоже согласен. Добавление объекта в начале и в конце должно быть быстрее, чем добавление объекта в его середине.
Рахул Растоги
1
Язык, используемый в столбце LinkedList этой таблицы, противоречив. И добавление, и добавление в LinkedList выполняются быстрее, чем добавление элементов в середине, но медленнее, чем добавление или добавление в ArrayLists или Vectors. Это связано с тем, что каждая вставка требует выделения памяти с нелокальными ссылками, что увеличивает вероятность пропадания кэша. Несмотря на то, что поиск в LinkedList является линейным с количеством элементов и указатель на конец не сохраняется, добавление происходит все же быстрее, чем предварительное, поскольку память перераспределяется только для одного элемента.
София Голд