Вектор происходит назад со дней API перед наборами и был модифицирован с тех пор, чтобы быть частью ее. Из того, что я читал, причина, она не удерживается от использования, состоит в том, потому что базовый API зависит от нее.
ArrayList был записан с нуля, поскольку часть API Наборов и как таковой должна использоваться, если Вы не должны поддерживать версии Java вниз к 1,2.
при необходимости в ориентированном на многопотоковое исполнение ArrayList можно использовать статический метод фабрики Collections.synchronizedList(new ArrayList<type>);
для генерации списка.
Если потокобезопасность не будет проблемой, [то 112] будет быстрее, поскольку она не должна синхронизироваться. Хотя, необходимо всегда объявлять переменную как List
так, чтобы реализация могла быть изменена позже по мере необходимости.
я предпочитаю обрабатывать свою синхронизацию явно, потому что много операций требует множественных вызовов. Например:
if (!myList.isEmpty()) {
myList.get(0);
}
должен быть:
synchronized (myList) {
if (!myList.isEmpty()) {
myList.get(0);
}
}
Если потокобезопасность не является проблемой, необходимо всегда использовать ArrayList
. Вектор имеет издержки синхронизации, и было показано, что различия в производительности между ArrayList
и Vector
плачевны. Можно погуглить для большого количества сравнительных тестов производительности.
Вот один Синхронизация & Производительность .
Игнорируя синхронизацию, основное различие между Vector
и ArrayList
- то, что Vector
массив изменяемого размера (подобный Вектору STL C++), и ArrayList
Список, который, оказывается, поддерживается массивом.
различие проявляется в setSize () метод. Нет никакого эквивалентного метода в ArrayList
. Некоторая экскавация ++ Java-разработчики становится одержимой этим. Существуют много легки способы работать вокруг этого так, это не должна быть проблема.
Просто не делают ошибку сообщения разработчику C++, который ArrayList
является эквивалентом std::vector
. Вы никогда не будете слышать конец о нем.