Действительно ли существует большая разница между производительностью 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, чтобы он мог стать частью структуры коллекции