Удължаване на дължината на масива

1. Общ преглед

В този урок ще разгледаме различните начини, по които можем да разширим масив Java.

Тъй като масивите са непрекъснат блок памет, отговорът може да не е очевиден, но нека го разопаковаме сега.

2. Използване на Arrays.copyOf

Първо, нека разгледаме Arrays.copyOf . Ще копираме масива и ще добавим нов елемент към копието:

public Integer[] addElementUsingArraysCopyOf(Integer[] srcArray, int elementToAdd) { Integer[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1); destArray[destArray.length - 1] = elementToAdd; return destArray; }

Начинът, по който Arrays.copyOf работи, е, че той взема srcArray и копира броя на елементите, посочени в аргумента за дължина, в нов масив, който той създава вътрешно. Размерът на новия масив е аргументът, който предоставяме.

Едно нещо, което трябва да забележите, е, че когато аргументът за дължина е по-голям от размера на масива източник, Arrays.copyOf ще запълни допълнителните елементи в целевия масив с null .

В зависимост от типа данни поведението на пълнежа ще бъде различно. Например, ако използваме примитивни типове данни вместо Integer, допълнителните елементи се запълват с нулите. В случай на char , Arrays.copyOf ще запълни допълнителни елементи с null, а в случай на boolean - с false .

3. Използване на ArrayList

Следващият начин, който ще разгледаме, е използването на ArrayList.

Първо ще преобразуваме масива в ArrayList и след това ще добавим елемента. След това ще преобразуваме ArrayList обратно в масив :

public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; ArrayList arrayList = new ArrayList(Arrays.asList(srcArray)); arrayList.add(elementToAdd); return arrayList.toArray(destArray); }

Имайте предвид, че сме предали srcArray, като го преобразуваме в колекция. В srcArray ще се пренесат основната масив в ArrayList .

Също така, друго нещо, което трябва да се отбележи, е, че сме предали целевия масив като аргумент на toArray . Този метод ще копира основния масив в destArray .

4. Използване на System.arraycopy

Накрая ще разгледаме System.arraycopy , който доста прилича на Arrays.copyOf :

public Integer[] addElementUsingSystemArrayCopy(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; System.arraycopy(srcArray, 0, destArray, 0, srcArray.length); destArray[destArray.length - 1] = elementToAdd; return destArray; }

Един интересен факт е, че Arrays.copyOf вътрешно използва този метод.

Тук можем да забележим, че копираме елементите от srcArray в destArray и след това добавяме новия елемент към destArray .

5. Изпълнение

Общото във всички решения е, че трябва да създадем нов масив по един или друг начин. Причината за това се крие в това как масивите се разпределят в паметта. Масивът съдържа непрекъснат блок памет за супер бързо търсене, поради което не можем просто да го преоразмерим.

Това, разбира се, оказва въздействие върху производителността, особено за големи масиви. Ето защо ArrayList преразпределя, ефективно намалявайки броя пъти, на които JVM трябва да преразпредели паметта.

Но ако правим много вмъквания, масивът може да не е правилната структура на данните и трябва да помислим за LinkedList .

6. Заключение

В тази статия разгледахме различните начини за добавяне на елементи в края на масив.

И както винаги, целият код е достъпен в GitHub.