В чем разница между двумя структурами данных ArrayList и Vector, и где вы должны использовать их?
Каковы различия между ArrayList и Vector?
Ответ 1
Различия
- Векторы синхронизированы, ArrayLists нет.
- Методы роста данных
Используйте ArrayLists, если нет особых требований к использованию векторов.
Синхронизация
Если несколько потоков одновременно обращаются к массиву ArrayList, мы должны синхронизировать блок кода, который модифицирует список либо структурно, либо просто модифицирует элемент. Структурная модификация означает добавление или удаление элементов (элементов) из списка. Установка значения существующего элемента не является структурной модификацией.
Collections.synchronizedList
обычно используется во время создания списка, чтобы избежать случайного несинхронизированного доступа к списку.
Рост данных
Внутренне, и ArrayList и Vector удерживают их содержимое с помощью массива. Когда элемент вставляется в ArrayList или Vector, объект должен будет расширить свой внутренний массив, если он исчерпан. Вектор по умолчанию удваивает размер его массива, а ArrayList увеличивает размер его массива на 50 процентов.
Ответ 2
Как говорится в документации, Vector
и ArrayList
почти эквивалентны. Разница в том, что доступ к Vector
синхронизирован, тогда как доступ к ArrayList
отсутствует. Это означает, что только один поток может вызывать методы на Vector
за раз, и есть небольшие накладные расходы при приобретении блокировки; если вы используете ArrayList
, это не так. Как правило, вы хотите использовать ArrayList
; в однопоточном корпусе это лучший выбор, и в многопоточном корпусе вы получаете лучший контроль за блокировкой. Хотите разрешить одновременное чтение? Хорошо. Хотите выполнить одну синхронизацию для партии из десяти записей? Также хорошо. Это требует немного большей осторожности на вашем конце, но это скорее всего то, что вы хотите. Также обратите внимание, что если у вас есть ArrayList, вы можете использовать функцию Collections.synchronizedList
, чтобы создать синхронизированный список, таким образом получив эквивалент Vector
.
Ответ 3
Vector
является сломанным классом, который не является потокобезопасным, несмотря на то, что он "синхронизирован" и используется только учащимися и другими неопытными программистами.
ArrayList
- это передовая реализация, используемая профессионалами и опытными программистами.
Профессионалы, нуждающиеся в реализации потокового списка, используют CopyOnWriteArrayList
.
Ответ 4
ArrayList
является более новым и на 20-30% быстрее.
Если вам не нужно что-то очевидное в Vector
, используйте ArrayList
Ответ 5
Существует два основных различия между Vector и ArrayList.
-
По умолчанию синхронизируется вектор, а ArrayList - нет. Примечание. Вы также можете синхронизировать ArrayList, передав объект arraylist методу Collections.synchronizedList(). Синхронизированное средство: оно может использоваться с несколькими потоками без какого-либо побочного эффекта.
-
ArrayLists растут на 50% от предыдущего размера, если для нового элемента пространство недостаточно для того, чтобы вектор увеличивался на 100% от предыдущего размера, когда нет места для нового входящего элемента.
Кроме этого, существуют некоторые практические различия между ними в плане усилий по программированию:
- Чтобы получить элемент в определенном месте из Vector, мы используем функцию elementAt (int index). Это имя функции очень длинное. Вместо этого в ArrayList мы имеем get (int index), который очень легко запоминается и используется.
- Аналогично замене существующего элемента новым элементом в векторе мы используем метод setElementAt(), который снова очень длинный и может раздражать программиста для повторного использования. Вместо этого ArrayList имеет добавить (int index, object) метод, который прост в использовании и запоминается. Таким образом, у них есть больше программируемых дружественных и простых в использовании имен функций в ArrayList.
Когда использовать какой?
- Старайтесь избегать использования векторов полностью. ArrayLists может делать все, что может сделать Вектор. Больше по сравнению с ArrayLists по умолчанию не синхронизированы. Если вы хотите, вы можете синхронизировать его, когда вам нужно, используя класс Collections util.
- ArrayList легко запоминает и использует имена функций.
Примечание: несмотря на то, что arraylist растет на 100%, вы можете избежать этого методом обеспеченности(), чтобы убедиться, что вы выделяете достаточную память на начальных этапах.
Надеюсь, что это поможет.
Ответ 6
ArrayList
и Vector
реализуют интерфейс List и поддерживают порядок вставки. Но есть много различий между классами ArrayList
и Vector
...
-
ArrayList
не синхронизирован. -
ArrayList
увеличивает 50% текущего размера массива, если количество элементов превышает его емкость. -
ArrayList
не является унаследованным классом, он представлен в JDK 1.2. -
ArrayList
работает быстро, потому что он не синхронизирован. -
ArrayList
использует интерфейс Iterator для перемещения элементов.
Вектор -
-
Vector
синхронизирован. -
Vector
приращение 100% означает удвоение размера массива, если общее количество элементов превышает его емкость. -
Vector
- это унаследованный класс. -
Vector
медленный, потому что он синхронизирован, то есть в многопотоковой среде, он будет удерживать другие потоки в состоянии runnable или non-runnable, пока текущий поток не освободит блокировку объекта. -
Vector
использует интерфейс Enumeration для перемещения элементов. Но он также может использовать Итератор.
См. Также: https://www.javatpoint.com/difference-between-arraylist-and-vector
Ответ 7
В основном оба ArrayList и Vector используют внутренний массив объектов.
ArrayList: Класс ArrayList расширяет AbstractList и реализует интерфейс List и RandomAccess (интерфейс маркера). ArrayList поддерживает динамические массивы, которые могут расти по мере необходимости. Это дает нам первую итерацию по элементам. ArrayList использует внутренний массив объектов; они создаются с начальным размером по умолчанию 10. Если этот размер превышен, коллекция автоматически увеличивается до половины размера по умолчанию, равного 15.
Вектор:. Вектор похож на ArrayList, но различия в нем: он синхронизирован и его начальный размер по умолчанию равен 10, а когда размер превышает его размер, увеличивается в два раза от первоначального размера, что означает новый размер будет 20. Вектор - это единственный класс, отличный от ArrayList, для реализации RandomAccess. Вектор имеет четыре конструктора, из которых берут два параметра Вектор (int initialCapacity, int capacityIncrement) capacityIncrement - это количество, на которое увеличивается емкость при переполнении вектора, поэтому он имеет больший контроль над нагрузкой фактор.
Некоторые другие отличия:
Ответ 8
ArrayList Vs Vector:
1) Синхронизация: ArrayList не синхронизирован, что означает одновременное использование нескольких потоков в ArrayList. Напр. если один поток выполняет операцию добавления в ArrayList, может быть другой поток, выполняющий операцию удаления в ArrayList одновременно в многопоточной среде.
в то время как вектор синхронизирован. Это означает, что если один поток работает над Vector, ни один другой поток не сможет его удержать. В отличие от ArrayList, только один поток может выполнять операцию по вектору за раз.
2) Изменение размера: Оба ArrayList и Vector могут динамически увеличиваться и сжиматься, чтобы поддерживать оптимальное использование хранилища, однако способ изменения размеров отличается. ArrayList увеличивается на половину своего размера при изменении размера, в то время как Vector удваивает размер по умолчанию, когда растет.
3) Производительность: ArrayList дает лучшую производительность, так как он не синхронизирован. Операции с вектором дают низкую производительность, так как они потокобезопасны, поток, который работает на Vector, получает блокировку, которая заставляет другой поток ждать, пока блокировка не будет выпущена.
4) fail-fast: Сначала позвольте мне объяснить, что происходит с ошибкой: если коллекция (ArrayList, vector и т.д.) получает структурное изменение любыми способами, кроме методов добавления или удаления итератора, после создания итератора, то итератор будет бросать ConcurrentModificationException. Структурная модификация относится к добавлению или удалению элементов из коллекции.
В соответствии с векторным javadoc перечисление, возвращаемое вектором, не является быстрым. С другой стороны, итератор и listIterator, возвращенные ArrayList, работают с ошибкой.
5) Кто входит в коллекцию? Этот вектор не был частью структуры коллекции, позже он был включен в коллекции. Его можно считать устаревшим кодом. В коллекции Vector Collection ничего не может быть. Поэтому Vector следует избегать. Если существует необходимость в потокобезопасной работе, синхронизировать ArrayList, как описано в следующем разделе этого сообщения, или использовать CopyOnWriteArrayList, который является потокобезопасным вариантом ArrayList.
Между этими классами существует несколько сходств, которые следующие:
И Vector, и ArrayList используют growable array data structure
.
Итератор и listIterator, возвращаемые этими классами (Vector и ArrayList), являются fail-fast
.
Они оба являются классами ordered collection
, поскольку они поддерживают порядок вставки элементов.
Vector и ArrayList как allows duplicate and null values
.
Они оба растут и сжимаются автоматически, когда происходит переполнение и удаление.