Каковы различия между этими двумя структурами данных ArrayList и Вектор, и где необходимо использовать каждого из них?
Различия
Используйте списки массивов, если нет особых требований к использованию векторов.
Синхронизация
Если несколько потоков обращаются к списку ArrayList одновременно, мы должны внешне синхронизировать блок кода, который модифицирует список либо структурно, либо просто модифицирует элемент. Структурная модификация означает добавление или удаление элемента (ов) из списка. Установка значения существующего элемента не является структурной модификацией.
Collections.synchronizedList
обычно используется во время создания списка, чтобы избежать случайного несинхронизированного доступа к списку.
Рост данных
Внутри и ArrayList, и Vector сохраняют свое содержимое с помощью Array. Когда элемент вставляется в ArrayList или Vector, объект должен будет расширить свой внутренний массив, если ему не хватит места. По умолчанию Vector увеличивает размер своего массива вдвое, в то время как ArrayList увеличивает размер своего массива на 50 процентов.
Как сказано в документации, Vector
и ArrayList
почти эквивалентны. Разница в том, что доступ к Vector
синхронизирован, а доступ к ArrayList
- нет. Это означает, что только один поток может одновременно вызывать методы Vector
, и есть небольшие накладные расходы на получение блокировки; если вы используете ArrayList
, это не так. В целом, лучше использовать ArrayList
; в однопоточном случае это лучший выбор, а в многопоточном случае вы получаете лучший контроль над блокировкой. Хотите разрешить одновременное чтение? Отлично. Хотите выполнить одну синхронизацию для партии из десяти записей? Тоже хорошо. Это потребует от вас немного больше заботы, но, скорее всего, это то, что вам нужно. Также обратите внимание, что если у вас есть ArrayList, вы можете использовать функцию Collections.synchronizedList
для создания синхронизированного списка, получив таким образом эквивалент Vector
.
ArrayList
новее и на 20-30% быстрее.
Если вам не нужно что-то явно очевидное в Vector
, используйте ArrayList