Раньше я всегда думал, что вектор хорошо использовать для неописуемых объектов, когда длина неизвестна. Насколько я знал, я думал, что это тоже потокобезопасно
Что изменит то, что Vector
больше нельзя использовать, и какова альтернатива?
Раньше я всегда думал, что вектор хорошо использовать для неописуемых объектов, когда длина неизвестна. Насколько я знал, я думал, что это тоже потокобезопасно
Что изменит то, что Vector
больше нельзя использовать, и какова альтернатива?
Вы должны использовать ArrayList
вместо Vector
. Vector
использовал внутреннюю синхронизацию, но этого редко бывает достаточно для фактической согласованности, и она замедляет выполнение только тогда, когда она действительно не нужна.
Также см. этот вопрос о стеке overflow.
java.util.concurrent
. И если он недоступен для нескольких потоков, ArrayList
дешевле. Устраните серые области, в которых коллекция может использоваться несколькими потоками: вы не можете сделать коллекцию внутренне ориентированной на многопотоковое исполнение; то, как его клиенты используют его, всегда является фактором.
- person erickson; 24.11.2009
Вместо этого вы можете использовать ArrayList
.
Если вам нужна синхронизированная версия, вы можете сделать что-то вроде:
ArrayList arrayList = new ArrayList();
List synchList = Collections.synchronizedList(arrayList);
ArrayList
теперь лучше использовать класс. Vector
теперь считается устаревшим и имеет дополнительную нагрузку на производительность, поскольку является потокобезопасным.
Используйте ArrayList
, когда вам нужна реализация List
, но не нужна потокобезопасность, и используйте CopyOnWriteArrayList
, когда вам нужна реализация List
, которая является потокобезопасной.
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()
(и других методов).
Vector
не устарел. Я полагаю, поскольку нет замены один на один, они этого не сделали. - person skaffman   schedule 24.11.2009CopyOnWriteArrayList
более или менее является заменой один к одному, поскольку это поточно-ориентированная реализацияList
. В большинстве случаевCopyOnWriteArrayList
должен обеспечивать лучшую производительность, чемVector
. - person Dónal   schedule 15.02.2014