Avatar ·

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

Привет всем! Я новичок в Java и столкнулся с задачей, которая кажется простой, но я не могу найти элегантного решения. Мне нужно объединить два массива в один. Например, у меня есть массив целых чисел `int[] a = {1, 2, 3}` и `int[] b = {4, 5, 6}`. Я хочу получить третий массив `int[] c = {1, 2, 3, 4, 5, 6}`. Я пробовал написать цикл вручную, но код получается громоздким, особенно если массивы разных типов (например, строки и числа). В Python я бы просто написал `c = a + b`, но в Java так не работает. Я знаю, что в Java нет встроенного оператора для конкатенации массивов, но, может быть, есть какой-то стандартный метод или библиотечная функция? Я слышал про `System.arraycopy()`, но не совсем понимаю, как его применить для этой задачи. Подскажите, пожалуйста, самый простой и читаемый способ объединить два массива в Java. Желательно с примером кода. Заранее спасибо! <<>>

Использование System.arraycopy() — классический способ

Самый распространённый и эффективный способ объединить два массива в Java — использовать встроенный метод System.arraycopy(). Он работает быстро, так как является native-методом. Вот как это сделать:


public class ArrayConcatenation {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        int[] b = {4, 5, 6};

        // Создаём новый массив нужной длины
        int[] c = new int[a.length + b.length];

        // Копируем элементы первого массива
        System.arraycopy(a, 0, c, 0, a.length);
        // Копируем элементы второго массива
        System.arraycopy(b, 0, c, a.length, b.length);

        // Вывод результата
        System.out.println(Arrays.toString(c)); // [1, 2, 3, 4, 5, 6]
    }
}

Разбор параметров System.arraycopy():

  • src — исходный массив (откуда копируем)
  • srcPos — начальная позиция в исходном массиве (обычно 0)
  • dest — целевой массив (куда копируем)
  • destPos — начальная позиция в целевом массиве (для второго массива — a.length)
  • length — количество копируемых элементов

Этот метод подходит для любых типов массивов: примитивных (int[], double[]) и ссылочных (String[], Object[]).

Универсальный метод для любых типов

Чтобы не писать один и тот же код каждый раз, создайте вспомогательный метод:


public static <T> T[] concatenate(T[] first, T[] second) {
    T[] result = Arrays.copyOf(first, first.length + second.length);
    System.arraycopy(second, 0, result, first.length, second.length);
    return result;
}

Использование:


String[] names1 = {"Alice", "Bob"};
String[] names2 = {"Charlie", "Diana"};
String[] allNames = concatenate(names1, names2);
System.out.println(Arrays.toString(allNames)); // [Alice, Bob, Charlie, Diana]

Современный способ через Stream API (Java 8+)

Если вы используете Java 8 или новее, можно применить Stream API. Это более декларативный подход, хотя и менее производительный:


import java.util.stream.Stream;

String[] arr1 = {"A", "B"};
String[] arr2 = {"C", "D"};
String[] result = Stream.concat(Arrays.stream(arr1), Arrays.stream(arr2))
                         .toArray(String[]::new);

Для примитивных массивов используйте IntStream, LongStream или DoubleStream:


int[] a = {1, 2, 3};
int[] b = {4, 5, 6};
int[] c = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).toArray();

Что выбрать?

  • Для максимальной производительности — используйте System.arraycopy().
  • Для читаемости и гибкости (особенно с объектами) — Stream API.
  • Если работаете с коллекциями — конвертируйте в List и обратно: List<Integer> combined = new ArrayList<>(Arrays.asList(a)); combined.addAll(Arrays.asList(b));

Все эти подходы решают вашу задачу. Выбирайте тот, который лучше подходит под ваш стиль кода и требования к производительности.

<<>>

Использование Arrays.copyOf() и циклов

Если вы не хотите использовать System.arraycopy(), можно обойтись методами из java.util.Arrays:


int[] a = {1, 2, 3};
int[] b = {4, 5, 6};

int[] c = Arrays.copyOf(a, a.length + b.length);
for (int i = 0; i < b.length; i++) {
    c[a.length + i] = b[i];
}

Arrays.copyOf() создаёт новый массив указанной длины и копирует в него элементы из исходного. Затем мы вручную добавляем элементы второго массива. Этот способ более наглядный для новичков, но менее производительный, чем System.arraycopy().

Для массивов объектов — через List

Если вы работаете с массивами объектов (например, String[]), можно временно преобразовать их в список:


String[] a = {"x", "y"};
String[] b = {"z"};
List<String> list = new ArrayList<>(Arrays.asList(a));
list.addAll(Arrays.asList(b));
String[] c = list.toArray(new String[0]);

Этот подход удобен, когда нужно не только объединить, но и выполнить дополнительные операции (например, удалить дубликаты). Однако он создаёт лишние объекты, поэтому для больших массивов лучше использовать System.arraycopy().

Совет: если вы часто выполняете конкатенацию, рассмотрите использование ArrayList вместо массивов — он поддерживает динамическое добавление элементов.