Варианты объединения двух массивов в Java
В любом языке с долгой историей появляется то-ли фича то ли бага делать одну, вроде бы простую вещь можно несколькими способами. Возьмем тривиальную задачу: объединить два массива одного типа в один в java. И тут оказывается есть три способа как это сделать с разной степенью абстракции и со своими плюсами и минусами. Рассмотрим их.
Первый и самый короткий — это использовать старую добрую библиотечку Apache Commons Lang. И метод public static
Пример использования:
1 |
String[] both = ArrayUtils.addAll(first, second); |
Но этот путь чреват зависимостями. После опыта разработки на android устройства я аккуратно стал относиться к зависимостям и стараюсь не использовать целую библиотеку ради одной функции. Но java очень мощный язык и мы можем написать свою функцию (метод) для объединения двух массивов в один в независимости от типа данных:
1 2 3 4 5 6 7 8 9 10 11 |
public <T> T[] concatenate (T[] A, T[] B) { int aLen = A.length; int bLen = B.length; @SuppressWarnings("unchecked") T[] C = (T[]) Array.newInstance(A.getClass().getComponentType(), aLen+bLen); System.arraycopy(A, 0, C, 0, aLen); System.arraycopy(B, 0, C, aLen, bLen); return C; } |
Следует обратить внимание, что массивы могут быть только с элементами, тип которых — потомок от типа Object. Впрочем, зачастую так и бывает. Можно расслабиться.
Если же все-таки случилось страшное, или же мы используем старый JDK, без поддержки произвольной типизации функций, то всегда можно переписать без дженериков:
1 2 3 4 5 6 7 8 |
Foo[] concat(Foo[] A, Foo[] B) { int aLen = A.length; int bLen = B.length; Foo[] C= new Foo[aLen+bLen]; System.arraycopy(A, 0, C, 0, aLen); System.arraycopy(B, 0, C, aLen, bLen); return C; } |