ArrayList
Основная реализация - это массив, который обладает высокой эффективностью в доступе к элементам (быстрый запрос, медленная вставка, модификация и удаление элементов)
По сравнению с LinkedList, он эффективен, но безопасен.
ArrayList Array - это изменяемый массив, который может получить доступ ко всем элементам, включая NULL
Основная реализация выполняется с использованием массивов
переходной объект [] elementData;
Строительный метод
Private Static Final int default_capacity = 10; частный статический конечный объект [] empty_elementData = {}; Private Static Final Object [] defaultCapacity_empty_ElementData = {}; Transient Object [] elementData; private int size; // Создание пустого списка public arraylist () {this.elementData = defaultCapacity_empty_elementData; } // Создание пустого списка указанной начальной емкости public arraylist (int initialCapacity) {if (initialCapacity> 0) {this.elementData = new объект [initialCapacity]; } else if (initialCapacity == 0) {this.ElementData = empty_elementData; } else {бросить new allogalargumentException ("Незаконная способность:"+ initialCapacity); }} // Создание списка указанных элементов сбора, которые расположены в порядке итеративного возврата элементов соединения Public ArrayList (Collection <? Extends E> C) {elementData = c.ToArray (); if ((size = elementdata.length)! = 0) {// c.toarray может (неправильно) не возвращать объект [] (см. 6260652) if (elementdata.getClass ()! = Object []. Class) elementData = arrays.copyof (elementData, size, object []. Class); } else {// заменить пустым массивом. this.elementData = empty_elementData; }}хранилище
// Элемент в указанном положении списка заменяется элементом, а исходный элемент в этой позиции возвращается общедоступным E Set (int index, e element) {rangecheck (index); // Проверьте емкость массива и бросить: indexoutofboundsexception e oldValue = elementData (index); elementData [index] = element; вернуть OldValue; } // Добавить указанный элемент в конце списка общедоступный логический add (e e) {eveRecapacity -internal (размер + 1); // Array Expansion ElementData [size ++] = E; вернуть истину; } // Добавить элемент в указанном положении списка Public Boolean Add (e E) {EncureCapacityInternal (size ++] = E; return true;} // Добавить элемент в указанном положении списка Public void Add (int index, e element) {rangeCheckforadd (index); ancureCapacity (size+1); //clectmentd modcount (size+1); SRCPRO: Начальная позиция в массиве исходных дел // DEST: Mountion Marray, DestPost: начало позиции целевого массива, длина: количество элементов массива, которые должны быть скопированы // Перемещение элементов, в настоящее время в этой позиции, и все последующие элементы обратно один положений. size ++; System.ArrayCopy (a, 0, elementdata, размер, numnew); C.toarray (); numnew;Читать
// Удалить элемент в указанном положении этого списка public e удалить (int index) {rangecheck (index); modcount ++; E oldValue = elementData (индекс); int nummoved = size - index - 1; if (Nummoved> 0) System.ArrayCopy (elementData, index+1, elementData, index, Nummoved); elementData [-size] = null; // Ясно, чтобы дать GC выполнить свою работу, вернуть OldValue; } // Удалить элемент в этом списке public boolean remove (object o) {if (o == null) {for (int index = 0; index <size; index ++) if (elementdata [index] == null) {fastremove (index); вернуть истину; }} else {for (int index = 0; index <size; index ++) if (o.equals (elementdata [index])) {fastremove (index); вернуть истину; }} вернуть false; } private void fastremove (int index) {modcount ++; int nummoved = size - index - 1; if (Nummoved> 0) System.ArrayCopy (elementData, index+1, elementData, index, Nummoved); elementData [-size] = null; // Ясно, чтобы дать GC выполнять свою работу}Расширение массива
Всякий раз, когда элемент добавляется в массив, необходимо проверить, превышает ли количество элементов длину текущего массива после добавления элементов. Если он превышает длину, массив будет расширен для удовлетворения потребностей добавления данных.
public void EnsureCapacity (int mincapacity) {int minexpand = (elementData! = defaultCapacity_empty_elementData)? 0: default_capacity; if (mincapacity> minexpand) {убедитесь, что explicitcapacity (mincapacity); }} private void evureCapacityInternal (int mincapacity) {if (elementData == defaultCapacity_empty_elementData) {mincapacity = math.max (default_capacity, mincapacity); } обеспечить explicitcapacity (mincapacity); } private void inseexplicitcapacity (int mincapacity) {modcount ++; // переполненный код if (mincapacity - elementdata.length> 0) растут (mincapacity); } private void Grow (int mincapacity) {// переполнение кода int oldCapacity = elementData.length; int newCapacity = OldCapacity + (OldCapacity >> 1); if (newcapacity - mincapacity <0) newcapacity = mincapacity; if (newcapacity - max_array_size> 0) newcapacity = gugecapacity (mincapacity); // mincapacity обычно близка к размеру, так что это победа: elementData = arrays.copyof (elementdata, newcapacity); } private static int hugecapacity (int mincapacity) {if (mincapacity <0) // переполнить новый OutofmemoryError (); return (mincapacity> max_array_size)? Integer.max_value: max_array_size; }Рукописный ArrayList
открытый класс myarraylist /*реализует список <e>* /{private Transiet объект [] elementData; частный размер Int; // количество элементов public myarraylist () {this (10); } public myArrayList (int initialCapacity) {if (initialCapacity <0) {try {Trop New Exception (); } catch (Exception e) {e.printstackTrace (); }} elementData = new Object [initialCapacity]; } public int size () {return size; } public boolean isempty () {return size == 0; } // Удалить объект в соответствии с индексом public void remove (int index) бросает исключение {rangecheck (index); int nummoved = size-index-1; if (Nummoved> 0) {System.ArrayCopy (elementData, index+1, elementData, index, Nummoved); } elementData [-size] = null; } // Удалить объект public boolean remove (Object obj) бросает исключение {for (int i = 0; i <size; i ++) {if (get (i) .equals (obj)) {remove (i); } вернуть true; } вернуть true; } // Модифицировать элемент набор публичных объектов (int index, Object obj) бросает исключение {rangeCheck (index); Object OldValue = elementData [index]; elementData [index] = obj; вернуть OldValue; } // Вставить элемент в указанную позицию public void add (int index, объект obj) бросает исключение {rangecheck (index); EncureCapacity (); System.ArrayCopy (ElementData, Index, ElementData, Index+1, Size-Index); elementData [index] = obj; размер ++; } public void Add (Object Object) {EncureCapacity (); /*elementData [size] = Object; size ++;*/ elementData [size ++] = объект; // сначала присвоить значение, затем увеличьте себя} Общедоступный объект Get (int index) бросает исключение {rangecheck (index); return ElementData [index]; } public void rangeCheck (int index) бросает исключение {if (index <0 || index> = size) {throw new Exception (); }} // Расширение public void evyRecapacity () {// Array Расширение и копия содержимого if (size == elementData.length) {// elementData = новый объект [size*2+1]; Написать таким образом, что содержание в исходном массиве потерян объект [] newarray = new Object [size*2+1]; // Скопировать контент в массиве/*for (int i = 0; i <newarray.length; i ++) {newarray [i] = elementData [i]; }*/ System.ArrayCopy (elementData, 0, newarray, 0, elementdata.length); elementData = newarray; }} // Проверка публичной статической void main (string [] args) {myarraylist myarraylist = new myarraylist (3); myarraylist.add ("111"); myarraylist.add ("222"); myarraylist.add ("333"); myarraylist.add ("444"); myarraylist.add ("555"); попробуйте {myarraylist.remove (2); myarraylist.add (3, «новая стоимость»); myarraylist.set (1, "Modify"); } catch (Exception e1) {// todo автоматически сгенерированный блок e1.printstacktrace (); } System.out.println (myarraylist.size ()); for (int i = 0; i <myarraylist.size (); i ++) {try {system.out.println (myarraylist.get (i)); } catch (Exception e) {e.printstackTrace (); }}}}