Научитесь объединять два примитивных массива или массива объектов для создания нового массива, состоящего из элементов обоих массивов. Мы научимся объединять элементы массива, используя простой цикл for, потоковый API и другие служебные классы.
Обратите внимание, что независимо от того, какой метод мы используем для слияния массивов, он всегда создает новый массив объединенной длины обоих массивов, а затем копирует элементы из обоих массивов в новый массив, по одному за раз, в цикле. Поэтому основное различие между различными способами, обсуждаемыми ниже, заключается в читаемости кода и простоте использования.
1. Объединение массивов с помощью цикла «for»
Непосредственное использование цикла for для объединения массивов является наиболее эффективным с точки зрения производительности. Он не создает ненужных временных переменных и объектов.
Мы создаем новый массив комбинированной длины двух заданных массивов, а затем начинаем помещать элементы из обоих массивов в новый массив в цикле. Теоретически этот метод должен давать наилучшую производительность.
int[] intArray1 = {1, 2, 3};int[] intArray2 = {4, 5, 6};result = new int[intArray1.length + intArray2.length];int index = 0;for(int item: intArray1) {result[index++] = item;}for(int item: intArray2) {result[index++] = item;}System.out.println(Arrays.toString(result)); //[1, 2, 3, 4, 5, 6]
2. Использование System.arraycopy()
Использование arraycopy() эквивалентно использованию цикла for. Здесь мы делегируем задачу копирования элементов массива в новый массив собственной функции arraycopy().
С точки зрения производительности метод arraycopy() должен работать на одном уровне с методом цикла for.
int[] intArray1 = {1, 2, 3};int[] intArray2 = {4, 5, 6};int[] result = new int[intArray1.length + intArray2.length];System.arraycopy(intArray1, 0, result, 0, intArray1.length);System.arraycopy(intArray2, 0, result, intArray1.length, intArray2.length);System.out.println(Arrays.toString(result)); //[1, 2, 3, 4, 5, 6]
Мы можем написать универсальный метод типа, который можно использовать для объединения массивов, содержащих элементы любого типа объекта.
static <T> T[] concatArrays(T[] array1, T[] array2) {T[] result = Arrays.copyOf(array1, array1.length + array2.length);System.arraycopy(array2, 0, result, array1.length, array2.length);return result;}//Invoking the methodString[] resultObj = concatArrays(strArray1, strArray2);System.out.println(Arrays.toString(resultObj)); //[1, 2, 3, 4, 5, 6]
3. Объединение массивов с помощью Stream.concat()
Метод stream.concat() создает лениво объединенный поток, элементами которого являются все элементы первого потока, за которыми следуют все элементы второго потока.
Чтобы получить потоки, мы преобразуем массивы в потоки, а затем concat() для слияния потоков. Позже мы можем собрать элементы потока в массив, чтобы завершить процесс слияния.
String[] strArray1 = {"1", "2", "3"};String[] strArray2 = {"4", "5", "6"};String[] both = Stream.concat(Arrays.stream(strArray1),Arrays.stream(strArray2)).toArray(String[]::new);
Эту технику можно использовать для объединения более двух массивов в одном операторе.
String[] mergedArray = Stream.concat(Arrays.stream(strArray1),Arrays.stream(strArray2),Arrays.stream(strArray3),Arrays.stream(strArray4)).toArray(String[]::new);
Для объединения массива примитивов мы можем напрямую использовать следующие классы:
- IntStream
- LongStream
- DoubleStream
Эти классы предоставляют методы concat(), специфичные для этих примитивов.
int[] intArray1 = {1, 2, 3};int[] intArray2 = {4, 5, 6};int[] result = IntStream.concat(Arrays.stream(intArray1),Arrays.stream(intArray2)).toArray();
4. ArrayUtils из Apache Commons
Мы можем использовать библиотеки третьих сторон, которые предоставляют простые в использовании однострочные методы для слияния массивов. Они также обеспечивают тот же уровень производительности, что и предыдущие методы.
Похожий API — ArrayUtils.addAll(), который добавляет все элементы заданных массивов в новый массив. Обратите внимание, что возвращаемый массив всегда возвращает новый массив, даже если мы объединяем два массива и один из них равен нулю.
String[] resultObj = ArrayUtils.addAll(strArray1, strArray2);int[] result = ArrayUtils.addAll(intArray1, intArray2);
5. API гуавы
API Guava предоставляют следующие классы, которые можно использовать для объединения массивов примитивов, а также массивов типов объектов.
- Ints.concat(): объединяет два массива int.
- Longs.concat(): объединяет два длинных массива.
- Doubles.concat(): объединяет два двойных массива.
- ObjectArrays.concat(): объединяет два массива объектных типов.
String[] resultObj = ObjectArrays.concat(strArray1, strArray2, String.class);int[] result = Ints.concat(intArray1, intArray2);
6. Заключение
В этом уроке мы научились объединять два массива в Java. Мы научились использовать собственные API Java, а также служебные классы из сторонних библиотек.
Все вышеперечисленные методы дадут почти одинаковый уровень производительности для небольших массивов. Для больших массивов рекомендуется провести тестирование производительности перед финализацией подхода. Однако теоретически использование цикла for и метода arraycopy() должно обеспечить наилучшую производительность среди всех.