System.arraycopy() vs. Arrays.copyOf() in Java

If we want to copy an array, we can use either System.arraycopy() or Arrays.copyOf(). In this post, I use a simple example to demonstrate the difference between the two.

1. Simple Code Examples

System.arraycopy()

int[] arr = {1,2,3,4,5};
 
int[] copied = new int[10];
System.arraycopy(arr, 0, copied, 1, 5);//5 is the length to copy
 
System.out.println(Arrays.toString(copied));

Output:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 4, 5, 0, 0, 0, 0]

Arrays.copyOf()

int[] copied = Arrays.copyOf(arr, 10); //10 the the length of the new array
System.out.println(Arrays.toString(copied));
 
copied = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(copied));

Output:

[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
[1, 2, 3]

2. The Major Difference

The difference is that Arrays.copyOf does not only copy elements, it also creates a new array. System.arrayCopy copies into an existing array.

If we read the source code of Arrays.copyOf(), we can see that it uses System.arraycopy().

public static int[] copyOf(int[] original, int newLength) { 
   int[] copy = new int[newLength]; 
   System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); 
   return copy; 
}

4 thoughts on “System.arraycopy() vs. Arrays.copyOf() in Java”

  1. private static void rotateArray(int[] src, int shiftBy) {

    int pos = src.length – shiftBy;
    int[] res = new int[src.length];
    System.arraycopy(src, pos, res, 0, pos – 1);
    System.arraycopy(src, 0, res, pos – 1, pos);
    System.out.println(Arrays.toString(res));
    }

  2. Hi, in the first output by this program, how is the series of 0’s, that is ten zeroes displayed first? I guess ideally the output of the statements should only be {0,1,2,3,4,5,0,0,0,0}
    System.arraycopy(arr, 0, copied, 1, 5);//5 is the length to copy

    System.out.println(Arrays.toString(copied));

Leave a Comment