How can I concatenate two arrays in Java? How can I concatenate two arrays in Java? arrays arrays

How can I concatenate two arrays in Java?


I found a one-line solution from the good old Apache Commons Lang library.
ArrayUtils.addAll(T[], T...)

Code:

String[] both = ArrayUtils.addAll(first, second);


Here's a simple method that will concatenate two arrays and return the result:

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;}

Note that it will not work with primitive data types, only with object types.

The following slightly more complicated version works with both object and primitive arrays. It does this by using T instead of T[] as the argument type.

It also makes it possible to concatenate arrays of two different types by picking the most general type as the component type of the result.

public static <T> T concatenate(T a, T b) {    if (!a.getClass().isArray() || !b.getClass().isArray()) {        throw new IllegalArgumentException();    }    Class<?> resCompType;    Class<?> aCompType = a.getClass().getComponentType();    Class<?> bCompType = b.getClass().getComponentType();    if (aCompType.isAssignableFrom(bCompType)) {        resCompType = aCompType;    } else if (bCompType.isAssignableFrom(aCompType)) {        resCompType = bCompType;    } else {        throw new IllegalArgumentException();    }    int aLen = Array.getLength(a);    int bLen = Array.getLength(b);    @SuppressWarnings("unchecked")    T result = (T) Array.newInstance(resCompType, aLen + bLen);    System.arraycopy(a, 0, result, 0, aLen);    System.arraycopy(b, 0, result, aLen, bLen);            return result;}

Here is an example:

Assert.assertArrayEquals(new int[] { 1, 2, 3 }, concatenate(new int[] { 1, 2 }, new int[] { 3 }));Assert.assertArrayEquals(new Number[] { 1, 2, 3f }, concatenate(new Integer[] { 1, 2 }, new Number[] { 3f }));


Using Stream in Java 8:

String[] both = Stream.concat(Arrays.stream(a), Arrays.stream(b))                      .toArray(String[]::new);

Or like this, using flatMap:

String[] both = Stream.of(a, b).flatMap(Stream::of)                      .toArray(String[]::new);

To do this for a generic type you have to use reflection:

@SuppressWarnings("unchecked")T[] both = Stream.concat(Arrays.stream(a), Arrays.stream(b)).toArray(    size -> (T[]) Array.newInstance(a.getClass().getComponentType(), size));