Подтвердить что ты не робот

ArrayList vs. Vectors в Java, если безопасность потоков не является проблемой

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

4b9b3361

Ответ 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, чтобы он мог стать частью структуры коллекции