ArrayList и Векторы в Java, если безопасность потока не имеет значения - PullRequest
28 голосов
/ 19 ноября 2008

Есть ли разница между производительностью Vector и ArrayList? Является ли хорошей практикой использование ArrayLists всегда, когда безопасность потоков не является проблемой?

Ответы [ 5 ]

40 голосов
/ 19 ноября 2008

Вектор берет свое начало со времен API, предшествующих коллекциям, и с тех пор был модернизирован, чтобы стать его частью. Из того, что я прочитал, причина, по которой он не устарел, заключается в том, что от него зависит ядро ​​API.

ArrayList был написан с нуля как часть API коллекций и поэтому должен использоваться, если вам не требуется поддержка версий Java до 1.2.

Если вам нужен потокобезопасный ArrayList, вы можете использовать статический фабричный метод Collections.synchronizedList(new ArrayList<type>); для генерации списка.

15 голосов
/ 19 ноября 2008

Если безопасность потока не является проблемой, ArrayList будет быстрее, поскольку не нужно синхронизировать. Хотя вы всегда должны объявлять вашу переменную как List, чтобы ее реализация могла быть изменена позже при необходимости.

Я предпочитаю обрабатывать свою синхронизацию явно, потому что для многих операций требуется несколько вызовов. Например:

if (!myList.isEmpty()) { 
    myList.get(0);
}

должно быть:

synchronized (myList) {
   if (!myList.isEmpty()) { 
       myList.get(0);
   }
}
9 голосов
/ 19 ноября 2008

Если безопасность потока не является проблемой, вы всегда должны использовать ArrayList. Vector имеет накладные расходы на синхронизацию, и было показано, что различия в производительности между ArrayList и Vector ужасны Вы можете погуглить для многих тестов производительности.

Вот один Сроки и производительность .

5 голосов
/ 20 ноября 2008

Игнорируя синхронизацию, основное различие между Vector и ArrayList заключается в том, что Vector - это массив с изменяемым размером (аналогично C ++ STL Vector), а ArrayList - это список, который поддерживается массивом.

Разница проявляется в методе setSize () . В ArrayList нет эквивалентного метода. Некоторые бывшие разработчики Java на C ++ зацикливаются на этом. Есть несколько простых способов обойти это, поэтому это не должно быть проблемой.

Только не делайте ошибку, говоря разработчику C ++, что ArrayList эквивалентен std::vector. Вы никогда не услышите конец этого.

3 голосов
/ 03 декабря 2012

ArrayList против векторов

1. Синхронизация и поточная безопасность

Первое и главное отличие между Vector и ArrayList состоит в том, что Vector синхронизирован, а ArrayList - нет, это означает, что все методы, которые структурно изменяют Vector, например, add () или remove () синхронизируются, что делает его поточно-ориентированным и позволяет безопасно использовать его в многопоточной и параллельной среде. С другой стороны, методы ArrayList не синхронизированы, поэтому не подходят для использования в многопоточной среде.

2. Скорость и производительность

ArrayList намного быстрее, чем Vector. Поскольку Vector синхронизирован и поточно-ориентирован, он платит за синхронизацию, что делает его немного медленным. С другой стороны, ArrayList не синхронизирован и быстр, что делает его очевидным выбором в однопоточной среде доступа.

3. Емкость

Всякий раз, когда Vector пересекает указанное пороговое значение, он увеличивается на значение, указанное в полеacityIncrement, в то время как вы можете увеличить размер ArrayList, вызывая метод ensureCapacity().

4. Перечисление и итератор

Vector может возвращать перечисление элементов, которые он хранит, вызывая метод elements(), который не является быстрым при сбое, в отличие от Iterator и ListIterator, возвращаемым ArrayList.

5. Наследие

Еще один момент, о котором стоит помнить: Vector - это один из тех классов, который поставляется с JDK 1.0 и изначально не входит в состав Collection Framework, но в более поздней версии он был переработан для реализации интерфейса List, чтобы он мог стать частью Framework Collection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...