java.util.Vector — альтернативы

Раньше я всегда думал, что вектор хорошо использовать для неописуемых объектов, когда длина неизвестна. Насколько я знал, я думал, что это тоже потокобезопасно

Что изменит то, что Vector больше нельзя использовать, и какова альтернатива?


person ST.    schedule 24.11.2009    source источник
comment
Любопытно, что Vector не устарел. Я полагаю, поскольку нет замены один на один, они этого не сделали.   -  person skaffman    schedule 24.11.2009
comment
Обратите внимание, что это также относится и к Hashtable — вместо этого используйте HashMap.   -  person Bill K    schedule 01.04.2013
comment
@skaffman CopyOnWriteArrayList более или менее является заменой один к одному, поскольку это поточно-ориентированная реализация List. В большинстве случаев CopyOnWriteArrayList должен обеспечивать лучшую производительность, чем Vector.   -  person Dónal    schedule 15.02.2014


Ответы (5)


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

Также см. этот вопрос о стеке overflow.

person Paul Wagland    schedule 24.11.2009
comment
Хорошая мысль о том, что редко бывает достаточно хорошо для реальной согласованности. Если коллекция видна нескольким потокам, вам, вероятно, следует использовать (и хорошо понимать) соответствующую коллекцию из java.util.concurrent. И если он недоступен для нескольких потоков, ArrayList дешевле. Устраните серые области, в которых коллекция может использоваться несколькими потоками: вы не можете сделать коллекцию внутренне ориентированной на многопотоковое исполнение; то, как его клиенты используют его, всегда является фактором. - person erickson; 24.11.2009
comment
в настоящее время вы знаете, был ли улучшен Vector или мы должны придерживаться ArrayList? - person Aquarius Power; 12.11.2014
comment
@AquariusPower В контракте указано, что необходимо использовать синхронизацию, поэтому его нельзя улучшить. Тем не менее, современная JVM иногда может удалить синхронизацию в качестве оптимизации, но в целом лучше использовать ArrayList. - person Paul Wagland; 08.12.2014

Вместо этого вы можете использовать ArrayList.

Если вам нужна синхронизированная версия, вы можете сделать что-то вроде:

ArrayList arrayList = new ArrayList();

List synchList = Collections.synchronizedList(arrayList);
person hexium    schedule 24.11.2009

ArrayList теперь лучше использовать класс. Vector теперь считается устаревшим и имеет дополнительную нагрузку на производительность, поскольку является потокобезопасным.

person Kyle Rosendo    schedule 24.11.2009

Используйте ArrayList, когда вам нужна реализация List, но не нужна потокобезопасность, и используйте CopyOnWriteArrayList, когда вам нужна реализация List, которая является потокобезопасной.

person Dónal    schedule 24.11.2009
comment
Вы должны иметь в виду, что CopyOnWriteArrayList копирует весь массив при мутационных операциях (добавить, удалить...). CopyOnWriteArrayList следует использовать только тогда, когда количество операций обхода (получение, итерация...) значительно превышает число мутационных операций. Источник: docs.oracle.com/javase/ 7/docs/api/java/util/concurrent/ - person ihebiheb; 16.01.2019

Vector — это устаревший класс коллекции из Java 1.0. В Java 1.2 (давно!), Collections Framework был добавлен, который включал новые классы коллекций, такие как ArrayList и HashMap, которые должны были заменить устаревшие классы Vector и Hashtable.

Как было сказано ранее, устаревшие классы коллекций имели встроенную синхронизацию, которая не нужна для многих приложений. Синхронизация снижает производительность, поэтому, если она не нужна, ее не следует использовать.

В некоторых случаях (когда ваша программа многопоточная и несколько потоков обращаются к одним и тем же данным) вам необходимо синхронизировать свои коллекции. Некоторые люди будут использовать старые классы Vector или Hashtable, но лучше использовать оболочку синхронизации, например, с ArrayList:

// Your standard, unsynchronized list
List<String> data = new ArrayList<String>();

// Use this to put it into a synchronization wrapper
List<String> syncedData = Collections.synchronizedList(data);

Дополнительную информацию см. в документации по API Collections.synchronizedList() (и других методов).

person Jesper    schedule 25.11.2009
comment
Если вам нужен потокобезопасный список, CopyOnWriteArrayList предлагает лучшую производительность (в большинстве случаев), чем Collections.synchronizedList(data) - person Dónal; 25.11.2009
comment
@ Донал Это не совсем так. - person Stefan Reich; 04.12.2017
comment
@StefanReich, пожалуйста, уточните - person Dónal; 05.12.2017
comment
CopyOnWriteArrayList копирует весь список при каждом изменении, поэтому он может быть невероятно медленным, если вы часто меняете список. - person Stefan Reich; 05.12.2017