Vector vs ArrayList в Java
ArrayList и Vector являются двумя наиболее часто используемыми классами в пакете collection java и разница между Vector и ArrayList является очень часто задаваемым вопросом. Хотя это простой вопрос, важно знать, когда использовать Vector или ArrayList, особенно когда вы работаете над большим проектом.В этой статье мы рассмотрим различия между Vector и ArrayList в Java и попытаемся понять концепцию, лежащую в основе этих различий.
Прежде чем мы перейдем к различиям между Vector и Vector и ArrayList, давайте увидим сходство между этими двумя:
- Vector и ArrayList используют расширяемую структуру хранения.
- ArrayList и Vector используют внутреннюю структуру массива.
- Оба списка сохраняют порядок, в котором вставляются элементы. Это означает, что вы можете получить объект в том порядке, в котором он был вставлен, если вы просматриваете ArrayList или Vector.
- Vector и ArrayList допускают дублирование элементов, а значения NULL.
- Iterator и listIterator, возвращаемые Vector и ArrayList, имеют тип fail-fast.
Vector vs ArrayList
1) Synchronization
ArrayList не синхронизирован, что означает, что несколько потоков могут обращаться к нему одновременно. Например, если поток выполняет операцию добавления в ArrayList, другой поток может выполнять параллельную операцию удаления в несинхронизированной многопоточной среде.
Vector синхронизирован. Это обеспечивает безопасное использование потоков в параллельной и многопоточной среде. Например, если поток выполняет операцию в Vector, ни один другой поток не сможет получить к нему доступ до тех пор, пока не завершится первый поток. В отличие от ArrayList, только один поток может выполнять операцию одновременно.
2) Performance
ArrayList более производительный и быстрый, поскольку он не синхронизирован, что делает его очень хорошим выбором в однопоточной среде. ArrayList также можно использовать в многопоточной среде, если потоки считывают только значения ArrayList.
Поскольку Vector синхронизирован, он платит цену за синхронизацию, что делает ее медленной и плохо работает. Поток, выполняющий операцию, блокирует доступ к другим потокам, поэтому они ждут, пока не будет снята блокировка.
Поскольку Vector синхронизирован, он платит цену за синхронизацию, что делает ее медленной и плохо работает. Поток, выполняющий операцию, блокирует доступ к другим потокам, поэтому они ждут, пока не будет снята блокировка.
3) Изменение размера
Емкость хранилища обоих списков может быть расширяемой или сокращаемой, Разработчики Java сделали его динамическим, чтобы поддерживать оптимальное использование хранилища. Однако у каждого свой метод. ArrayList увеличивается вдвое, в то время как Vector удваивает размер по умолчанию. Емкость ArrayList можно увеличить, вызвав метод ensureCapacity().
4) fail-fast
Для начала давайте разберемся, что такое fail-fast: если коллекция (ArrayList, Vector и т.д.) модифицирована, за исключением операций добавления и удаления итератора, то после создания итератора итератор вызовет исключение ConcurrentModificationException. Изменение структуры связано с добавлением или удалением элементов из коллекции.
Vector возвращает объект перечисления, вызывая elements() то есть не fail. С другой стороны, Iterator и ListIterator, возвращаемые ArrayList, являются отказоустойчивыми.
5) Кто на самом деле принадлежит к фреймворку коллекций?
Vector является одним из тех классов, которые появились в JDK 1.0 и изначально не были частью фреймворка Collection, но в последней версии он был принят во внимание, потому что он реализует интерфейс List, так что, он стал частью collection.
Фреймворк ArrayList был введен после Vector с выпуском JDK 1.2. ArrayList был более продвинутым, чем Vector, но он также обладал всеми спецификациями Vector. Таким образом, люди начали использовать ArrayList вместо Vector, и в этом случае Vector стал устаревшим классом.
Метод Операции синхронизации занимают много времени по сравнению с несинхронизированными операциями, поэтому, если ваше приложение должно работать быстрее и не нуждается в синхронизации, ArrayList будет правильным выбором с точки зрения производительности.
В этой таблице собраны 5 отличий, которые мы видели:
4) fail-fast
Для начала давайте разберемся, что такое fail-fast: если коллекция (ArrayList, Vector и т.д.) модифицирована, за исключением операций добавления и удаления итератора, то после создания итератора итератор вызовет исключение ConcurrentModificationException. Изменение структуры связано с добавлением или удалением элементов из коллекции.
Vector возвращает объект перечисления, вызывая elements() то есть не fail. С другой стороны, Iterator и ListIterator, возвращаемые ArrayList, являются отказоустойчивыми.
5) Кто на самом деле принадлежит к фреймворку коллекций?
Vector является одним из тех классов, которые появились в JDK 1.0 и изначально не были частью фреймворка Collection, но в последней версии он был принят во внимание, потому что он реализует интерфейс List, так что, он стал частью collection.
Фреймворк ArrayList был введен после Vector с выпуском JDK 1.2. ArrayList был более продвинутым, чем Vector, но он также обладал всеми спецификациями Vector. Таким образом, люди начали использовать ArrayList вместо Vector, и в этом случае Vector стал устаревшим классом.
Когда использовать Vector и ArrayList?
Это зависит от ваших потребностей, если ваш код выполняет синхронизацию процессов (потоков), Vector будет лучшим выбором, поскольку он гарантирует, что только один поток обращается к коллекции в каждый момент времени.Метод Операции синхронизации занимают много времени по сравнению с несинхронизированными операциями, поэтому, если ваше приложение должно работать быстрее и не нуждается в синхронизации, ArrayList будет правильным выбором с точки зрения производительности.
В этой таблице собраны 5 отличий, которые мы видели:
ArrayList | Vector |
---|---|
1) ArrayList не синхронизирован. | Вектор синхронизирован |
2) ArrayList увеличивается на 50% от своего текущего размера, если количество элементов превышает его емкость | Vector invrementes 100%, это означает удвоение своего первоначального размера, если количество элементов превышает его емкость |
3) ArrayList был введен в JDK 1.2. | Vector появился в JDK 1.0 |
4) ArrayList быстрый, потому что он не синхронизирован | Vector медленный, потому что он синхронизирован. В конкурентной среде он будет блокировать доступ к другим процессам до тех пор, пока первый поток не разрешит доступ |
5) ArrayList использует Iterator для перебора элементов | Vector использует интерфейс Enumeration для перебора элементов, но, он также может использовать Iterator |