
В Java массивы имеют фиксированную длину, поэтому прямого метода для их объединения не существует. Чтобы соединить два массива, необходимо создать новый массив, длина которого равна сумме длин исходных, и скопировать элементы вручную или с помощью встроенных функций.
Чаще всего используют метод System.arraycopy(), позволяющий копировать данные из одного массива в другой с указанием индекса начала и длины копируемого блока. Такой подход работает быстрее, чем копирование через цикл, и подходит для массивов любых типов, включая примитивы.
Для более универсальных сценариев можно использовать класс Arrays из пакета java.util в сочетании с методами Arrays.copyOf() и Arrays.copyOfRange(). Они позволяют удобно создавать новый массив нужного размера и затем добавлять элементы второго массива.
Если требуется работа с коллекциями, массивы часто преобразуют в ArrayList, где объединение выполняется методом addAll(). После этого можно вернуть результат в виде массива через вызов toArray(). Такой способ менее производителен для больших массивов, но удобен при работе с динамическими структурами данных.
Использование цикла for для поэлементного копирования

Цикл for позволяет вручную перенести элементы из двух массивов в один общий. Такой способ полезен, когда требуется полный контроль над порядком копирования или добавлением дополнительных операций при переносе.
Пример кода:
int[] a = {1, 2, 3};
int[] b = {4, 5};
int[] result = new int[a.length + b.length];
for (int i = 0; i < a.length; i++) {
result[i] = a[i];
}
for (int i = 0; i < b.length; i++) {
result[a.length + i] = b[i];
}
В первом цикле копируются все элементы массива a начиная с позиции 0. Во втором цикле элементы массива b размещаются после последних элементов массива a, начиная с индекса a.length.
Такой метод обеспечивает предсказуемый результат и даёт возможность изменять логику копирования, например, добавлять проверку условий перед записью элемента.
Применение System.arraycopy для объединения массивов
Метод System.arraycopy позволяет объединять массивы без создания промежуточных структур. Он копирует элементы напрямую на уровень памяти, что делает его быстрее по сравнению с циклами.
Пример:
int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
int[] result = new int[a.length + b.length];
System.arraycopy(a, 0, result, 0, a.length);
System.arraycopy(b, 0, result, a.length, b.length);
Здесь первый вызов помещает содержимое a в начало массива result, а второй добавляет элементы b сразу после них. Итог: {1, 2, 3, 4, 5, 6}.
Рекомендуется использовать System.arraycopy для объединения примитивных массивов, когда важна производительность и требуется минимизировать накладные расходы.
Метод Arrays.copyOf и Arrays.copyOfRange

Класс java.util.Arrays предоставляет методы copyOf и copyOfRange, которые применяются при объединении массивов.
Arrays.copyOf(источник, новаяДлина)создаёт копию массива с указанной длиной. Если новая длина больше исходной, оставшиеся элементы заполняются значениями по умолчанию.Arrays.copyOfRange(источник, from, to)возвращает часть массива от индексаfrom(включительно) доto(не включительно).
Пример объединения двух массивов:
int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
int[] result = Arrays.copyOf(a, a.length + b.length);
System.arraycopy(b, 0, result, a.length, b.length);
Использование copyOfRange может быть полезно для выбора части элементов:
int[] source = {10, 20, 30, 40, 50};
int[] part = Arrays.copyOfRange(source, 1, 4); // {20, 30, 40}
copyOfудобно применять для расширения массива и подготовки места для добавления новых элементов.copyOfRangeиспользуется для получения сегментов массива, что упрощает работу с подмассивами.
Соединение массивов через Stream API

Stream API позволяет объединять массивы в единый поток и преобразовывать его обратно в массив. Для этого используется метод Stream.concat(), который принимает два потока и возвращает общий.
Пример для массивов строк:
String[] arr1 = {"A", "B"};
String[] arr2 = {"C", "D"};
String[] result = Stream.concat(Arrays.stream(arr1), Arrays.stream(arr2))
.toArray(String[]::new);
В случае объединения большего количества массивов удобно применять Stream.of() с последующим flatMap():
int[] arr1 = {1, 2};
int[] arr2 = {3, 4};
int[] arr3 = {5, 6};
int[] result = Stream.of(arr1, arr2, arr3)
.flatMapToInt(Arrays::stream)
.toArray();
Такой подход сохраняет порядок элементов и не требует ручного копирования. Выбор метода (concat или flatMap) зависит от количества объединяемых массивов.
Работа с массивами объектов и примитивов
В Java массивы примитивов и массивы объектов обрабатываются по-разному. Примитивные типы (int, double, char и др.) хранят значения напрямую, тогда как массивы объектов содержат ссылки на экземпляры классов. Это важно учитывать при объединении массивов.
При работе с примитивами можно использовать стандартные методы из класса System и утилиты java.util.Arrays. Для объектов чаще применяют копирование ссылок, а при необходимости – глубокое копирование с помощью циклов или потоков.
| Тип массива | Особенности объединения | Подход |
|---|---|---|
| int[], double[] и др. | Копируются значения напрямую | System.arraycopy или Arrays.copyOf |
| String[], Integer[] и др. | Копируются ссылки на объекты | Arrays.copyOf, Stream.concat или ручное копирование |
| Пользовательские классы | Требуется учитывать необходимость глубокого копирования | Цикл с созданием новых объектов |
Пример: при объединении двух массивов int[] результат будет содержать реальные числовые значения, а при работе с массивами String[] объединение сохранит ссылки на строки без их дублирования в памяти.
Создание вспомогательного метода для объединения
Для объединения двух массивов в Java часто используют отдельный метод, который упрощает повторное применение и улучшает читаемость кода. Такой метод должен принимать два массива одного типа и возвращать новый массив, включающий элементы обоих исходных массивов.
Пример метода для массивов целых чисел:
public static int[] mergeArrays(int[] first, int[] second) {
int[] result = new int[first.length + second.length];
System.arraycopy(first, 0, result, 0, first.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}
Рекомендации по реализации:
- Использовать
System.arraycopyвместо ручного цикла для повышения производительности. - Проверять массивы на
nullи пустоту, чтобы избежатьNullPointerException. - Метод должен быть
static, если нет необходимости привязывать его к экземпляру класса. - Для массивов других типов заменить тип
intна нужный, напримерString,doubleи т.д. - Можно перегрузить метод для вариативного числа массивов через
varargs, если требуется объединять более двух массивов.
Пример с проверкой null:
public static int[] mergeArraysSafe(int[] first, int[] second) {
if (first == null) first = new int[0];
if (second == null) second = new int[0];
int[] result = new int[first.length + second.length];
System.arraycopy(first, 0, result, 0, first.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}
Использование вспомогательного метода позволяет централизовать логику объединения и легко модифицировать её при необходимости.
Сравнение подходов по читаемости и скорости
Метод с использованием цикла `for` и прямого копирования элементов в новый массив обеспечивает максимальный контроль над процессом и предсказуемую скорость. Для массивов по 1 млн элементов среднее время выполнения составляет около 15–20 мс на современных системах. Читаемость кода снижается при увеличении количества вложенных операций и необходимости явно отслеживать индексы.
Метод `System.arraycopy` демонстрирует высокую производительность: для массивов аналогичного размера время выполнения обычно не превышает 5–7 мс. Код компактный и легко поддерживается, однако требует понимания параметров метода: исходного массива, позиции начала копирования и длины сегмента.
Использование `Arrays.copyOf` и `Arrays.copyOfRange` удобно для однократного объединения массивов и повышает читаемость за счет минимального кода. Скорость выполнения несколько ниже, чем у `System.arraycopy`, примерно 7–10 мс для массивов по 1 млн элементов, но разница не критична для большинства приложений.
Потоковый метод `Stream.concat` позволяет объединять массивы без явного управления индексами. Читаемость высокая при работе с функциональными цепочками, однако производительность уступает классическим методам: для массивов по 1 млн элементов время может достигать 25–30 мс из-за накладных расходов на создание объектов Stream и промежуточных массивов.
Рекомендации: для больших массивов и критичных к скорости задач использовать `System.arraycopy`; для небольших массивов и приоритетной читаемости – `Arrays.copyOf` или `Stream.concat` при необходимости функционального стиля.
Вопрос-ответ:
Можно ли объединить два массива разного типа в Java?
В Java массивы строго типизированы, поэтому напрямую объединить массивы разных типов нельзя. Например, массив int[] и массив double[] объединить в один int[] нельзя без явного приведения типов или преобразования элементов. Обычно сначала создают массив общего типа, например Object[], и помещают туда элементы из обоих массивов с необходимыми преобразованиями.
Как объединить два массива через стандартные методы Java без использования сторонних библиотек?
Для массивов примитивного типа можно создать новый массив нужного размера, равного сумме длин исходных массивов, и скопировать элементы из обоих массивов с помощью метода System.arraycopy(). Например, System.arraycopy(arr1, 0, result, 0, arr1.length) и System.arraycopy(arr2, 0, result, arr1.length, arr2.length). Для массивов объектов можно использовать Arrays.copyOf и потом копировать оставшиеся элементы вручную.
Можно ли объединить массивы через коллекции в Java?
Да, массивы можно преобразовать в коллекции с помощью Arrays.asList(), добавить элементы в ArrayList и затем обратно преобразовать в массив через toArray(). Этот способ удобен для массивов объектов, но для примитивных типов потребуется использовать их обертки, например Integer вместо int.
Что произойдет, если объединить массивы с разной длиной?
Разная длина массивов не создаёт проблем при объединении. Нужно лишь создать новый массив, размер которого равен сумме длин исходных массивов, и правильно скопировать элементы. Если пропустить корректное копирование, часть элементов может остаться неинициализированной или быть потеряна.
Можно ли объединять массивы динамически во время выполнения программы?
Массивы в Java имеют фиксированный размер, поэтому их нельзя расширять после создания. Для динамического объединения используют коллекции, такие как ArrayList, которые позволяют добавлять элементы во время выполнения. После формирования коллекции её можно преобразовать обратно в массив, если требуется именно массивная структура.
