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 заполнит дополнительные элементы в массиве назначения нулевой .
В зависимости от типа данных, поведение начинки будет отличаться. Например, если мы используем примитивные типы данных вместо Интегер затем дополнительные элементы заполняются нулями. В случае char , Arrays.copyOf заполнит дополнительные элементы нулевой и в случае Булеан, с ложные .
3. Использование ArrayList
Следующий способ мы будем смотреть на это с помощью ArrayList.
Сначала мы преобразовать массив в ArrayList а затем добавить элемент. Тогда мы конвертировать ArrayList вернуться к массиву :
public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; ArrayListarrayList = new ArrayList<>(Arrays.asList(srcArray)); arrayList.add(elementToAdd); return arrayList.toArray(destArray); }
Обратите внимание, что мы прошли srcArray путем преобразования его в коллекция. srcArray будет заполнить базовый массив в ArrayList .
Кроме того, еще одна вещь, чтобы отметить, что мы прошли назначения массив в качестве аргумента, чтобы ТоАРРАй . Этот метод будет копирование базового массива в дестрай .
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 дестрай а потом добавить новый элемент в дестрай .
5. Производительность
Одна вещь, общая во всех решениях является то, что мы должны создать новый массив так или иначе. Причина этого заключается в том, как массивы распределяются в памяти. Массив содержит смежный блок памяти для супер-быстрого осмотра, поэтому мы не можем просто изменить его.
Это, конечно, влияет на производительность, особенно для больших массивов. Вот почему ArrayList перераспределяет, эффективно уменьшая количество раз, необходимое JVM для перераспределения памяти.
Но, если мы делаем много вставок, массив не может быть правильной структурой данных, и мы должны рассмотреть LinkedList .
6. Заключение
В этой статье мы изучили различные способы добавления элементов в конец массива.
И, как всегда, весь код доступен более на GitHub .