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

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

9 ответов


различия

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

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

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

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

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

ссылка

рост данных

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

ссылка


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


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

ArrayList-Это список применяемых профессионалами и опытными программистами.

профессионалы, желающие реализации threadsafe List, используют CopyOnWriteArrayList.


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

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


существует 2 основных дифференцирования между вектором и ArrayList.

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

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

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

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

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

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

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

надеюсь, что это помогает.


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

ArrayList -

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

вектор -

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

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

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

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


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

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

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

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


ArrayList Vs Vector:

1) синхронизации: ArrayList не синхронизирован, что означает, что несколько потоков могут работать на ArrayList одновременно. Например, если один поток выполняет операцию добавления в ArrayList, может быть другой поток, выполняющий операцию удаления в ArrayList одновременно в многопоточной среде

пока вектор синхронизирован. Это означает, что если один поток работает над вектором, никакой другой поток может достать его. В отличие от ArrayList, только один поток может выполнять операцию над вектором одновременно.

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

3) производительность: ArrayList дает лучшую производительность, как это несинхронизированный. Векторные операции дают низкую производительность, поскольку они потокобезопасны, поток, который работает на Векторе, получает блокировку, которая заставляет другой поток ждать, пока блокировка не будет освобождена.

4) fail-fast: сначала позвольте мне объяснить, что такое fail-fast: если коллекция (ArrayList, vector и т. д.) структурно модифицируется любыми средствами, кроме методов добавления или удаления итератора, после создания итератора итератор будет вызывать ConcurrentModificationException. Структурная модификация относится к добавлению или удалению элементов из коллекции.

согласно векторному javadoc перечисление, возвращаемое вектором, не выполняется быстро. С другой стороны, итератор и listIterator, возвращаемые ArrayList, работают быстро.

5) кто действительно принадлежит к Collection framework? Вектор не был частью структуры коллекции, он был включен в коллекции позже. Его можно рассматривать как устаревший код. Нет ничего о Вектор, который коллекция списка не может сделать. Поэтому вектор следует избегать. Если есть необходимость в потокобезопасной работе, сделайте ArrayList синхронизированным, как описано в следующем разделе этого сообщения, или используйте CopyOnWriteArrayList, который является потокобезопасным вариантом ArrayList.

есть немного сходство между этими классами, которые являются следующими:

и Vector и ArrayList используют growable array data structure. Итератор и listIterator, возвращаемые этими классами (Vector и Класса ArrayList) являются fail-fast. Они оба ordered collection классы, поскольку они поддерживают порядок вставки элементов. Вектор & ArrayList оба allows duplicate and null values. Они оба растут и сжимаются автоматически, когда происходит переполнение и удаление.


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

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