Почему классы Java Vector и Stack считаются устаревшими илиDeprecated?
Почему класс Java Vector считается устаревшим, ненадежным или депрецированным?
Не является ли его использование актуальным при работе с многопоточностью?
Если я не хочу вручную синхронизировать объекты и просто хочу использовать потокобезопасную коллекцию, не создавая новые копии базового массива (как это делает CopyOnWriteArrayList
), то допустимо ли использовать Vector
?
Что насчет Stack
, который является подклассом Vector
? Какую альтернативу я должен использовать вместо него?
2 ответ(ов)
Вектор (Vector) был частью версии 1.0 — изначальная реализация имела два недостатка:
1. Название: Векторы на самом деле представляют собой списки, к которым можно получить доступ как к массивам, поэтому их следовало бы назвать ArrayList
(что является заменой Vector
в коллекциях Java 1.2).
2. Конкурентность: Все методы get()
и set()
синхронизированы, что не позволяет вам осуществлять тонкую настройку синхронизации.
Разница между ArrayList
и Vector
незначительна, поэтому рекомендуется использовать именно ArrayList
.
Согласно документации API:
По состоянию на платформу Java 2 v1.2 этот класс был модернизирован для реализации интерфейса List, что сделало его частью Java Collections Framework. В отличие от новых реализаций коллекций, Vector является синхронизированным.
Помимо уже упомянутых ответов о использовании Vector, существует ряд методов, связанных с перечислением и извлечением элементов, которые отличаются от интерфейса List. Разработчики, особенно те, кто изучал Java до версии 1.2, могут склоняться к их использованию, если они присутствуют в коде. Хотя enumerations (перечисления) работают быстрее, они не проверяют, была ли коллекция изменена во время итерации, что может вызвать проблемы. Поскольку Vector часто выбирается за его синхронизацию — с учетом одновременного доступа из нескольких потоков — это создает особенно серьезную проблему. Использование этих методов также значительно связывает код с Vector, что делает его замену на другую реализацию List довольно сложной задачей.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки
Создание репозитория Spring без сущности