Базовый ArrayList поддерживает динамический массив, и каждый экземпляр ArrayList имеет емкость. Эта емкость относится к размеру массива, используемого для хранения списков элементов. Это всегда, по крайней мере, равно размеру списка. Поскольку элементы постоянно добавляются в ArrayList, их емкость также увеличивается автоматически.
ArrayList не является синхронным (то есть не безопасным для потока). Если несколько потоков получают доступ к экземпляру ArrayList одновременно, и, по крайней мере, один из потоков структурно изменяет список, он должен поддерживать внешнюю синхронизацию. В многопоточной среде можно объявить меток, безопасный для потока, можно объявить с помощью метода Collections.synchronizedList, например:
Список arraylist = collections.synchronizedlist (new ArrayList ());
Ниже приведен исходный код ArrayList для анализа его принципа.
1. Метод строительства ArrayList: ArrayList предоставляет три различных метода строительства
1) ArrayList (), постройте пустой список с начальной емкостью 10.
2) ArrayList (int initycapacity), построение пустого списка с указанной начальной емкостью.
3) ArrayList (Collection <? Extends E> C), строит список элементов, содержащих указанную коллекцию, которые расположены в том порядке, в котором итератор коллекции возвращает их.
Исходный код заключается в следующем:
частный переходный объект [] elementData; public ArrayList (int initialCapacity) {super (); if (initialCapacity <0) бросить новую allosalargumentException («Незаконная емкость:»+ initialCapacity); this.elementData = новый объект [initialCapacity]; // генерировать массив типа объекта длины 10} public ArrayList () {this (10); // Call ArrayList (int i)} <br> <br> public arraylist (collection <? Extends e> c) {elementData = c.toarray (); // возвращать массив, содержащий все элементы в этом размере коллекции = elementData.length; // c.toarray может (неправильно) не возвращать объект [] (см. 6260652) if (elementdata.getClass ()! = Object []. Class) elementData = Arrays.copyof (elementData, size, object []. Class); // Скопировать указанный массив и вернуть массив типа объекта, содержащий один и тот же элемент и длину} При использовании ArrayList () для генерации объекта сбора без параметров конструктор ArrayList (int initialCapacity) вызывается внизу, чтобы создать массив типа объекта с длиной 10. При использовании конструктора с параметрами типа установки массив типа объекта, содержащий одинаковые элементы, и длину генерируется на дне.
2. Добавить метод: ArrayList предоставляет два метода добавления для добавления элементов
1) Добавьте (e e), добавьте указанный элемент в конец этого списка.
2) Добавить (int index, e e), вставьте указанный элемент в указанную позицию в этом списке. Переместите направо. Элемент в настоящее время в этой позиции (если есть) и все последующие элементы (индексированные по 1) частный размер int;
public boolean add (e e) {EncureCapacity (размер + 1); // расширить емкость массива elementData [size ++] = e; // Добавить элемент E в массив объектов с размером индекса и выполнить размер ++ return true; } public void add (int index, e element) {if (index> size || index <0) // Если указанный подписатель массива, который должен быть вставлен, превышает емкость массива или указанный индекс меньше 0, добавьте исключение, новая индексаутофббаундсекцепция («Индекс:»+Index+», Size:«+size); EncureCapacity (размер+1); // расширить систему емкости массива. Arraycopy (ElementData, Index, ElementData, Index + 1, Size - Index); // Скопировать массив из указанного исходного массива, и копия начинается с указанной позиции в указанную позицию целевого массива. <br> // elementdata --- Источника массива --- начальная позиция в массиве исходной массивы <br> // elementData --- Индекс целевого массива+1 --- Пусковой позиции в целевой массиве <br> // Размер-Индекс --- Количество элементов массива для копирования elementdata [index] = element; // Поместите элемент, который будет добавлен на указанный размер индекса массива ++; } public void EnsureCapacity (int mincapacity) {modcount ++; int oldCapacity = elementData.length; // емкость исходного массива if (mincapacity> oldcapacity) {Object oldData [] = elementData; int newcapacity = (OldCapacity * 3)/2 + 1; // Определите емкость нового массива, которая в 1,5 раза превышает емкость исходного массива +1 if (newcapacity <mincapacity) newcapacity = mincapacity; // mincapacity обычно близка к размеру, так что это победа: elementData = arrays.copyof (elementdata, newcapacity); // скопировать указанный массив и вернуть емкость нового массива как newcapacity}} Если в коллекции добавлено более 10 элементов, нижний слой ArrayList генерирует новый массив с длиной в 1,5 раза + 1 из исходного массива и скопирует элементы в исходном массиве в новый массив, а последующие добавленные элементы будут размещены в новом массиве. Этот процесс повторяется, когда длина нового массива не может вместить вновь добавленные элементы. Это принцип реализации добавления элементов в коллекцию.
3. Получить метод:
1) Получить (int index), вернуть элемент в указанном положении в этом списке.
public e Get (int index) {rangecheck (index); // Проверьте, является ли указанный индекс, переданный IS Legal Deform (e) elementData [index]; // Возврат элемент массива с индексом индекса индекса массива} private void rangeCheck (int index) {if (index> = size) // Если входящий индекс больше или равен емкости набора, бросьте исключение, добавляя новый indexoutOfBoundsexception («Индекс:»+Index+», Size:«+размер); } 4. Удалить метод:
1) e Удалить (int index), удалить элемент в указанном положении в этом списке. Переместите все последующие элементы влево (уменьшение их индекса на 1).
2) Boolean Remove (Object O), удалите указанный элемент, который впервые появляется в этом списке (если присутствует). Если список не содержит этого элемента, список не будет изменен, а логическое значение будет возвращено.
public e удалить (int index) {rangecheck (index); // Проверьте, является ли указанный индекс законным modcount ++; E oldValue = (e) elementData [index]; // Получить элемент массива указанного индекса int nummoved = size - index - 1; // количество элементов, которые должны быть перемещены, если (Nummoven> 0) System.ArrayCopy (ElementData, Index+1, ElementData, Index, Nummoved); // переместить массив элемент elementdata [-size] = null; // Пусть GC сделает свою работу вернуть OldValue; } public boolean remove (object o) {if (o == null) {// Если пропущенный параметр null для (int index = 0; index <size; index ++) if (elementdata [index] == null) {// Удалить первое появление Null fastremove (index); вернуть истину; }} else {for (int index = 0; index <size; index ++) if (o.equals (elementdata [index])) {fastremove (index); вернуть истину; }} вернуть false; } private void fastremove (int index) {// Удалить элемент в указанной позиции, метод реализации аналогичен удалению (int i) modcount ++; int nummoved = size - index - 1; if (Nummoved> 0) System.ArrayCopy (elementData, index+1, elementData, index, Nummoved); elementData [-size] = null; // Пусть GC сделает свою работу} 5. Метод клона:
1) Объектный клон (), возвращает мелкую копию этого экземпляра ArrayList (сами не копируя эти элементы).
public Object Clone () {try {arraylist <e> v = (arraylist <e>) super.clone (); // Расчет метода клона класса объекта для возврата объекта ArrayList V.ElementData = Arrays.copyof (elementData, size); // скопировать целевой массив v.modcount = 0; возврат V; } catch (clonenotsupportedException e) {// Это не должно произойти, так как мы клонируют, бросаем новый InternalError (); }} Приведенный выше анализ некоторых ключевых исходных кодов ArrayList, мы знаем основной принцип реализации ArrayList. Есть следующие моменты и баллы для исходного кода ArrayList:
1) Базовый уровень ArrayList реализован на основе массивов, и целевой элемент можно найти точно в соответствии с следующими стандартами, поэтому эффективность поиска высока; Тем не менее, добавление или удаление элементов будет включать в себя движение позиции большого количества элементов, что является неэффективным.
2) Arraylist предоставляет три различных метода строительства. Метод конструкции без параметра генерирует массив типа объекта с длиной 10 по умолчанию на нижнем слое. Когда количество элементов, добавленных в наборе, превышает 10, массив будет автоматически расширяться, то есть генерировать новый массив и поместить элементы оригинального массива в новый массив.
3) Метод EnceRecapacity расширяет массив, который будет генерировать новый массив с длиной в 1,5 раза + 1 исходного массива. Поскольку элементы постоянно добавляются в ArrayList, повторите процесс, когда длина массива не может удовлетворить потребности.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.