Как объединить два массива в Java? Поиск эффективного способа конкатенации
Основные способы объединения массивов в 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. Но если библиотека уже есть в проекте, это отличный вариант.