Добавяне на елемент към Java Array срещу ArrayList

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.