Avatar ·

Как объединить два массива в Java? Поиск эффективного способа конкатенации

Всем привет! Я новичок в Java (учу около месяца) и столкнулся с задачей, которая кажется простой, но я не могу найти элегантного решения. Мне нужно объединить два массива целых чисел в один. Например, есть массив `int[] a = {1, 2, 3}` и `int[] b = {4, 5, 6}`. Я хочу получить третий массив `c = {1, 2, 3, 4, 5, 6}`. Я написал такой код: ```java int[] a = {1, 2, 3}; int[] b = {4, 5, 6}; int[] c = new int[a.length + b.length]; for (int i = 0; i < a.length; i++) { c[i] = a[i]; } for (int i = 0; i < b.length; i++) { c[a.length + i] = b[i]; } ``` Он работает, но выглядит громоздко. Мне кажется, что в Java должно быть что-то встроенное для такой распространённой операции. Я пробовал использовать `Arrays.concat()` или `c = a + b`, но компилятор ругается. Подскажите, пожалуйста, как правильно объединять массивы в Java? Может есть стандартный метод в `java.util.Arrays` или какой-то другой удобный способ? Интересуют как решения для примитивных типов (`int[]`), так и для объектов (`String[]`). Заранее спасибо за помощь! <<>>

Основные способы объединения массивов в Java

В Java, к сожалению, нет встроенного метода для прямой конкатенации массивов (как, например, в Python или JavaScript). Однако существует несколько проверенных подходов. Рассмотрим лучшие из них.

1. Использование System.arraycopy() (рекомендуется для примитивов)

Это самый производительный способ для примитивных типов. Метод работает на уровне JVM и выполняет быстрое копирование памяти.

public static int[] concatArrays(int[] a, int[] b) {
    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);
    return result;
}

// Пример использования:
int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
int[] c = concatArrays(a, b); // {1, 2, 3, 4, 5, 6}

2. Использование Arrays.copyOf() и System.arraycopy()

Более лаконичный вариант, где первый массив копируется через Arrays.copyOf(), а второй — через System.arraycopy().

public static int[] concatArrays(int[] a, int[] b) {
    int[] result = Arrays.copyOf(a, a.length + b.length);
    System.arraycopy(b, 0, result, a.length, b.length);
    return result;
}

3. Для массивов объектов — Arrays.stream() (Java 8+)

Стримы предоставляют элегантный функциональный подход, особенно удобный для объединения массивов объектов.

public static <T> T[] concatArrays(T[] a, T[] b) {
    return Stream.concat(Arrays.stream(a), Arrays.stream(b))
                 .toArray(size -> Arrays.copyOf(a, size));
}

// Пример для String[]:
String[] names1 = {"Alice", "Bob"};
String[] names2 = {"Charlie", "David"};
String[] allNames = concatArrays(names1, names2); // {"Alice", "Bob", "Charlie", "David"}

4. Для примитивов через стримы (Java 8+)

Если вы работаете с int[], можно использовать IntStream:

public static int[] concatArrays(int[] a, int[] b) {
    return IntStream.concat(Arrays.stream(a), Arrays.stream(b))
                    .toArray();
}

5. Использование ArrayList (для объектов)

Если вам нужно часто добавлять элементы, лучше сразу использовать ArrayList, а не массивы:

String[] arr1 = {"A", "B"};
String[] arr2 = {"C", "D"};

List<String> list = new ArrayList<>(Arrays.asList(arr1));
list.addAll(Arrays.asList(arr2));
String[] result = list.toArray(new String[0]); // {"A", "B", "C", "D"}

Сравнение производительности

  • System.arraycopy() — самый быстрый (нативная реализация).
  • Arrays.copyOf() — чуть медленнее, но читаемее.
  • Стримы — удобны для функционального стиля, но медленнее из-за overhead.
  • ArrayList — удобен для динамического добавления, но требует преобразования.

Рекомендация

Для production-кода используйте System.arraycopy() для примитивов и Stream.concat() для объектов (если версия Java >= 8). Ваш первоначальный вариант с циклами тоже рабочий, но менее эффективный и читаемый.

<<>>

Альтернативный подход: использование сторонних библиотек

Если вы используете популярные библиотеки, можно воспользоваться их готовыми утилитами:

Apache Commons Lang

Библиотека commons-lang3 предоставляет метод ArrayUtils.addAll():

import org.apache.commons.lang3.ArrayUtils;

int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
int[] c = ArrayUtils.addAll(a, b); // {1, 2, 3, 4, 5, 6}

// Работает и с объектами:
String[] s1 = {"X", "Y"};
String[] s2 = {"Z"};
String[] s3 = ArrayUtils.addAll(s1, s2); // {"X", "Y", "Z"}

Google Guava

Библиотека Guava от Google предлагает ObjectArrays.concat():

import com.google.common.collect.ObjectArrays;

String[] first = {"one", "two"};
String[] second = {"three"};
String[] result = ObjectArrays.concat(first, second, String.class); // {"one", "two", "three"}

Когда это полезно?

  • Если проект уже использует эти библиотеки — не изобретайте велосипед.
  • Для частых операций с массивами (копирование, вставка, удаление) — ArrayUtils содержит много полезных методов.
  • Код становится более читаемым и менее подвержен ошибкам.

Важно: Не добавляйте зависимость только ради конкатенации массивов — используйте нативные средства Java. Но если библиотека уже есть в проекте, это отличный вариант.