1. Общ преглед
В този урок ще разгледаме накратко приликите и различията в разпределението на паметта между масивите на Java и стандартния ArrayList . Освен това ще видим как да добавяме и вмъкваме елементи в масив и ArrayList .
2. Java масиви и ArrayList
Масивът на Java е основна структура от данни, предоставена от езика. За разлика от ArrayList е реализация на Списък интерфейс подкрепени от масив и е представена в Рамката на Java колекции.
2.1. Достъп и промяна на елементи
Можем да осъществим достъп и да променим елементите на масива, като използваме нотация в квадратни скоби:
System.out.println(anArray[1]); anArray[1] = 4;
От друга страна, ArrayList има набор от методи за достъп и промяна на елементи:
int n = anArrayList.get(1); anArrayList.set(1, 4);
2.2. Фиксиран срещу динамичен размер
И масив, и ArrayList разпределят куп памет по подобен начин, но това, което се различава, е, че масивът е с фиксиран размер, докато размерът на ArrayList се увеличава динамично.
Тъй като масивът на Java е с фиксиран размер, трябва да предоставим размера, докато го създаваме. Не е възможно да се увеличи размерът на масива, след като е бил създаден екземпляр. Вместо това трябва да създадем нов масив с коригирания размер и да копираме всички елементи от предишния масив.
ArrayList е реализируема масивна реализация на интерфейса List - тоест ArrayList нараства динамично, когато към него се добавят елементи. Когато броят на текущите елементи (включително новия елемент, който трябва да бъде добавен към ArrayList ) е по-голям от максималния размер на базовия масив, тогава ArrayList увеличава размера на базовия масив.
Стратегията за растеж на базовия масив зависи от изпълнението на ArrayList . Тъй като обаче размерът на базовия масив не може да се увеличава динамично, се създава нов масив и старите елементи на масива се копират в новия масив.
Операцията за добавяне има постоянни амортизирани разходи за време. С други думи, добавянето на n елемента към ArrayList изисква O (n) време.
2.3. Видове елементи
Масивът може да съдържа както примитивни, така и непримитивни типове данни, в зависимост от дефиницията на масива. Въпреки това, един ArrayList може да съдържа само не-примитивни типове данни .
Когато вмъкваме елементи с примитивни типове данни в ArrayList , компилаторът на Java автоматично преобразува примитивния тип данни в съответния клас на обвивка на обект.
Нека сега разгледаме как да добавяме и вмъкваме елементи в Java масиви и ArrayList .
3. Добавяне на елемент
Както вече видяхме, масивите са с фиксиран размер.
И така, за да добавим елемент, първо трябва да декларираме нов масив, който е по-голям от стария масив и да копираме елементите от стария масив към новосъздадения масив. След това можем да добавим новия елемент към този новосъздаден масив.
Нека да разгледаме нейното изпълнение в Java, без да използваме никакви помощни класове:
public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length+1]; for(int i = 0; i < srcArray.length; i++) { destArray[i] = srcArray[i]; } destArray[destArray.length - 1] = elementToAdd; return destArray; }
Като алтернатива класът Arrays предоставя полезен метод copyOf () , който помага при създаването на нов масив с по-голям размер и копиране на всички елементи от стария масив:
int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);
След като създадем нов масив, можем лесно да добавим новия елемент към масива:
destArray[destArray.length - 1] = elementToAdd;
От друга страна, добавянето на елемент в ArrayList е доста лесно :
anArrayList.add(newElement);
4. Вмъкване на елемент в индекс
Вмъкването на елемент с даден индекс без загуба на добавените преди това елементи не е проста задача в масиви.
На първо място, ако масивът вече съдържа броя на елементите, равен на неговия размер, първо трябва да създадем нов масив с по-голям размер и да копираме елементите в новия масив.
Освен това трябва да изместим всички елементи, които идват след посочения индекс, с една позиция надясно:
public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) { int[] destArray = new int[srcArray.length+1]; int j = 0; for(int i = 0; i < destArray.length-1; i++) { if(i == index) { destArray[i] = newElement; } else { destArray[i] = srcArray[j]; j++; } } return destArray; }
Въпреки това, ArrayUtils класа ни дава по-просто решение, за да вмъкнете елементи в масив :
int[] destArray = ArrayUtils.insert(2, srcArray, 77);
Трябва да посочим индекса, при който искаме да вмъкнем стойността, масива източник и стойността, която да вмъкнем.
Методът insert () връща нов масив, съдържащ по-голям брой елементи, с новия елемент в посочения индекс и всички останали елементи са изместени с една позиция надясно.
Имайте предвид, че последният аргумент на метода insert () е аргумент на променлива, така че можем да вмъкнем произволен брой елементи в масив.
Нека го използваме, за да вмъкнем три елемента в srcArray, започвайки от индекс два:
int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);
А останалите елементи ще бъдат изместени с три места надясно.
Освен това, това може да бъде постигнато тривиално за ArrayList :
anArrayList.add(index, newElement);
ArrayList измества елементите и вмъква елемента на необходимото място.
5. Заключение
В тази статия разгледахме Java array и ArrayList . Освен това разгледахме приликите и разликите между двете. Накрая видяхме как да добавяме и вмъкваме елементи в масив и ArrayList .
Както винаги, пълният изходен код на работещите примери е достъпен в GitHub.