Короткий ответ
Исторический класс Vector (Java 1.0) делает все свои методы synchronized, то есть каждый вызов защищён монитором на уровне объекта; ArrayList появился позже (Java 2) и не синхронизирован, поэтому в однопоточном коде работает заметно быстрее. Vector при переполнении удваивает размер массива (или растёт на capacityIncrement), а ArrayList увеличивает ёмкость примерно в полтора раза: oldCapacity + (oldCapacity >> 1).
Как это работает подробнее
Оба класса реализуют интерфейс List и внутри используют обычный массив, поэтому логика работы похожа. Разница в производительности — следствие синхронизации: у Vector она глобальная и приходится на каждый вызов, у ArrayList её нет вовсе. Из-за этого Vector считается устаревшим (legacy), хотя и не удалён из стандартной библиотеки.
- Потокобезопасность: Vector синхронизирован, но такая «безопасность» покупается блокировкой на каждой операции.
- Современная замена: при необходимости синхронизации берут ArrayList с
Collections.synchronizedList(...)либо потокобезопасные коллекции изjava.util.concurrent, напримерCopyOnWriteArrayList.
Пример кода
List<String> list = new ArrayList<>(); // не синхронизирован, быстрее
List<String> sync =
Collections.synchronizedList(new ArrayList<>()); // вместо Vector
Vector<String> vector = new Vector<>(); // легаси: все методы synchronizedЧто использовать на практике
- В современном коде используйте ArrayList — в однопоточных сценариях он быстрее и не несёт legacy-ограничений.
- Потокобезопасность обеспечивайте осознанно:
Collections.synchronizedListили коллекции изjava.util.concurrent. - Vector оставляйте только там, где он уже используется в старом коде.
Подводные камни
- Синхронизация Vector пооперационная: составные действия «проверить, затем добавить» всё равно требуют внешней синхронизации.
- Рост вдвое у Vector расходует больше памяти, чем рост в 1,5 раза у ArrayList.
- Не путайте Vector с Hashtable: это разные независимые legacy-классы, оба синхронизированы и оба вытеснены современными альтернативами.
Как отвечать на собеседовании
- Скажите, что оба реализуют List на базе массива → главное отличие: методы Vector синхронизированы, ArrayList — нет, отсюда скорость ArrayList в однопоточном коде → упомяните статус legacy у Vector и разную стратегию роста (вдвое против ×1,5) → завершите современной альтернативой: synchronizedList или CopyOnWriteArrayList вместо Vector.