Действительно ли существует большая разница между производительностью Vector и ArrayList? Является ли хорошей практикой использовать ArrayLists во все времена, когда безопасность потоков не является проблемой?
ArrayList vs. Vectors в Java, если безопасность потоков не является проблемой
Ответ 1
Вектор берет начало из дней API перед сборками и был дооснащен, поскольку он является его частью. Из того, что я прочитал, причина, по которой она не устарела, связана с тем, что от нее зависит основной API.
ArrayList был написан с нуля как часть API Collections и как таковой должен использоваться, если вам не нужно поддерживать версии Java до 1.2.
Если вам нужен потокобезопасный ArrayList, вы можете использовать статический метод factory Collections.synchronizedList(new ArrayList<type>); для создания списка.
Ответ 2
Если безопасность потоков не является проблемой, ArrayList будет быстрее, поскольку синхронизация не требуется. Хотя вы всегда должны объявлять свою переменную как List, чтобы при необходимости ее можно было изменить позже.
Я предпочитаю обрабатывать свою синхронизацию явно, потому что для многих операций требуется несколько вызовов. Например:
if (!myList.isEmpty()) {
myList.get(0);
}
должен быть:
synchronized (myList) {
if (!myList.isEmpty()) {
myList.get(0);
}
}
Ответ 3
Если безопасность потоков не является проблемой, вы всегда должны использовать ArrayList. Вектор имеет накладные расходы на синхронизацию, и было показано, что различия в производительности между ArrayList и Vector являются ужасными. Вы можете использовать Google для многих тестов производительности.
Здесь один Сроки и производительность.
Ответ 4
Игнорируя синхронизацию, основное различие между Vector и ArrayList заключается в том, что Vector - это изменяемый размер массива (аналогично С++ STL Vector), а ArrayList - это список, который подкрепляется массивом.
Разница проявляется в методе setSize(). В ArrayList нет эквивалентного метода. Некоторые разработчики ex-С++ Java зависеть от этого. Существует ряд простых способов обойти его, поэтому это не должно быть проблемой.
Просто не делайте ошибку, говоря разработчику С++, что ArrayList является эквивалентом std::vector. Вы никогда не услышите его конца.
Ответ 5
ArrayList против векторов
1. Синхронизация и безопасность потоков
В первую очередь разница между Vector и ArrayList заключается в том, что вектор синхронизирован, а ArrayList - нет, что означает, что весь метод, который структурно изменяет Вектор, например. add () или remove () синхронизируются, что делает его потокобезопасным и позволяет безопасно использовать его в многопоточной и параллельной среде. С другой стороны, методы ArrayList не синхронизируются, поэтому не подходят для использования в многопоточной среде.
2. Скорость и производительность
ArrayList быстрее, чем вектор. Поскольку Vector синхронизирован и потокобезопасен, он платит цену синхронизации, что делает ее очень медленной. С другой стороны, ArrayList не синхронизирован и не ускоряется, что делает его очевидным выбором в однопоточной среде доступа.
3. Емкость
Всякий раз, когда Vector пересекает заданный порог, он увеличивается сам по значению, указанному в поле capacityIncrement, в то время как вы можете увеличить размер ArrayList, вызвав метод ensureCapacity().
4. Перечисление и итератор
Вектор может возвращать перечисление элементов, которые он удерживает, вызывая метод elements(), который не работает быстро, в отличие от Iterator и ListIterator, возвращаемых ArrayList.
5. Наследие
Еще один момент, который стоит запомнить, - это вектор, который является одним из тех классов, который поставляется с JDK 1.0 и первоначально не является частью среды Collection, но в более поздней версии он был переопределен для реализации интерфейса List, чтобы он мог стать частью структуры коллекции