Сравнение Java Vector и ArrayList
Сегодня я изучал исходные коды Vector и ArrayList и углубил свое понимание этих двух классов.
В интерфейсе списка реализованы три класса: Arraylist, Vector и LinkedList. Я не буду много говорить о LinkedList, он обычно используется для поддержания порядка введения данных.
Arraylist и Vector реализованы с использованием массивов, и есть три основных различия:
1. Вектор многопоточный и безопасный, а Arraylist-нет. Это можно увидеть из исходного кода. Многие методы в векторном классе изменяются с помощью синхронизации, что приводит к эффективности вектора, которую нельзя сравнивать с ArrayList;
2. Оба используют линейные элементы непрерывного пространства, но когда пространство недостаточно, два класса добавляются по -разному. Многие пользователи сети говорят, что вектор удваивает исходное пространство, а ArrayList увеличивает исходное пространство на 50%. На самом деле, это примерно то же самое. Тем не менее, есть еще некоторые проблемы, которые можно увидеть из исходного кода, и он будет проанализирован из исходного кода позже.
3. Вектор может установить фактор роста, но ArrayList не может. Когда я впервые посмотрел на это, я не понял, что такое постепенный фактор. Однако я понял это, сравнивая два исходных кода. Давайте сначала рассмотрим методы строительства двух классов:
ArrayList имеет три метода строительства:
Public ArrayList (int initialCapacity) // Создание пустого списка с указанной начальной емкостью. Public ArrayList () // Создание пустого списка с начальной емкостью 10. Public ArrayList (Collection <? Extends E> C) // Создание списка элементов, содержащих указанную коллекцию
Вектор имеет четыре конструктора:
Public Vector () // Создание пустого вектора с использованием указанной начальной емкости и приращения емкости равным нулю. Общественный вектор (int initycapacity) // Создание пустого вектора, чтобы сделать размер его внутренней массивы данных, а его стандартная мощность - нулевой. Общественный вектор (Collection <? Extends E> C) // Создание вектора, содержащего элементы в указанной коллекции общественного вектора (int initialCapacity, int емкостью) // Создание пустого вектора, используя указанный начальный
Вектор имеет один метод строительства, чем ArrayList. Правильно, метод строительства общественного вектора (int initycapacity, int емкость). Возможность увеличения - это рост мощности, который является фактором роста, упомянутым выше, который не доступен в ArrayList.
Затем разместите два класса, чтобы добавить анализ исходного кода (версия JDK1.7):
// класс ArrayList Добавить исходный код: public boolean add (e e) {EncureCapacityInternal (размер + 1); // Приращивание ModCount !! elementData [size ++] = E; вернуть истину; } private void EnsureCapacityInternal (int mincapacity) {modcount ++; // Код с переполнением // Если после добавления элемента размер нового контейнера больше, чем емкость контейнера, то значение не может быть сохранено. Пространство необходимо расширить, если (mincapacity - elementdata.length> 0) расти (mincapacity); } private void Grow (int mincapacity) {// переполнение кода int oldCapacity = elementData.length; int newCapacity = OldCapacity + (OldCapacity >> 1); // пространство расширения увеличивается на 50% (то есть в 1,5 раза больше исходного) if (newcapacity - mincapacity <0) // Если контейнер все еще недостаточно после расширения, то просто установите Mincapacity до размера контейнера Newcapacity = mincapacity; if (newcapacity - max_array_size> 0) // Если расширенный контейнер слишком большой, то выполните HugeCapacity newcapacity = gugecapacity (mincapacity); // mincapacity обычно близка к размеру, так что это победа: elementData = arrays.copyof (elementdata, newcapacity); } Добавьте исходный код в векторный класс:
Общедоступный синхронизированный логический add (e e) {modcount ++; EncureCapacityHelper (ElementCount + 1); elementData [elementCount ++] = E; вернуть истину; } private void EnsureCapacityHelper (int mincapacity) {// код из переполнения, если (mincapacity - elementdata.length> 0) Grow (mincapacity); } private void Grow (int mincapacity) {// переполнение кода int oldCapacity = elementData.length; int newCapacity = OldCapacity + ((емкость -инкремент> 0)? емкость INTREMPREMENT: OldCapacity); /** Это расширение емкости требует суждения: если приращение емкости не инициализируется 0, то есть инициализация конструктора общественного вектора (int initycapency, int емкость), а затем емкость расширения емкости (OldCapacity+емкость), которая является ценностью исходной емкости плюс увеличение емкости; Если приращение емкости не установлено, то емкость после расширения составляет (OldCapacity+OldCapacity), которая в два раза превышает исходную емкость. **/ if (newcapacity - mincapacity <0) newcapacity = mincapacity; if (newcapacity - max_array_size> 0) newcapacity = gugecapacity (mincapacity); elementData = arrays.copyof (elementdata, newcapacity); }Благодаря анализу это должно быть понятно сейчас!
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!