Make copy of an array

前端 未结 11 2369
庸人自扰
庸人自扰 2020-11-21 23:05

I have an array a which is constantly being updated. Let\'s say a = [1,2,3,4,5]. I need to make an exact duplicate copy of a and call

相关标签:
11条回答
  • 2020-11-21 23:42

    If you must work with raw arrays and not ArrayList then Arrays has what you need. If you look at the source code, these are the absolutely best ways to get a copy of an array. They do have a good bit of defensive programming because the System.arraycopy() method throws lots of unchecked exceptions if you feed it illogical parameters.

    You can use either Arrays.copyOf() which will copy from the first to Nth element to the new shorter array.

    public static <T> T[] copyOf(T[] original, int newLength)
    

    Copies the specified array, truncating or padding with nulls (if necessary) so the copy has the specified length. For all indices that are valid in both the original array and the copy, the two arrays will contain identical values. For any indices that are valid in the copy but not the original, the copy will contain null. Such indices will exist if and only if the specified length is greater than that of the original array. The resulting array is of exactly the same class as the original array.

    2770
    2771    public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    2772        T[] copy = ((Object)newType == (Object)Object[].class)
    2773            ? (T[]) new Object[newLength]
    2774            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    2775        System.arraycopy(original, 0, copy, 0,
    2776                         Math.min(original.length, newLength));
    2777        return copy;
    2778    }
    

    or Arrays.copyOfRange() will also do the trick:

    public static <T> T[] copyOfRange(T[] original, int from, int to)
    

    Copies the specified range of the specified array into a new array. The initial index of the range (from) must lie between zero and original.length, inclusive. The value at original[from] is placed into the initial element of the copy (unless from == original.length or from == to). Values from subsequent elements in the original array are placed into subsequent elements in the copy. The final index of the range (to), which must be greater than or equal to from, may be greater than original.length, in which case null is placed in all elements of the copy whose index is greater than or equal to original.length - from. The length of the returned array will be to - from. The resulting array is of exactly the same class as the original array.

    3035    public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
    3036        int newLength = to - from;
    3037        if (newLength < 0)
    3038            throw new IllegalArgumentException(from + " > " + to);
    3039        T[] copy = ((Object)newType == (Object)Object[].class)
    3040            ? (T[]) new Object[newLength]
    3041            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    3042        System.arraycopy(original, from, copy, 0,
    3043                         Math.min(original.length - from, newLength));
    3044        return copy;
    3045    }
    

    As you can see, both of these are just wrapper functions over System.arraycopy with defensive logic that what you are trying to do is valid.

    System.arraycopy is the absolute fastest way to copy arrays.

    0 讨论(0)
  • 2020-11-21 23:44

    Nice explanation from http://www.journaldev.com/753/how-to-copy-arrays-in-java

    Java Array Copy Methods

    Object.clone(): Object class provides clone() method and since array in java is also an Object, you can use this method to achieve full array copy. This method will not suit you if you want partial copy of the array.

    System.arraycopy(): System class arraycopy() is the best way to do partial copy of an array. It provides you an easy way to specify the total number of elements to copy and the source and destination array index positions. For example System.arraycopy(source, 3, destination, 2, 5) will copy 5 elements from source to destination, beginning from 3rd index of source to 2nd index of destination.

    Arrays.copyOf(): If you want to copy first few elements of an array or full copy of array, you can use this method. Obviously it’s not versatile like System.arraycopy() but it’s also not confusing and easy to use.

    Arrays.copyOfRange(): If you want few elements of an array to be copied, where starting index is not 0, you can use this method to copy partial array.

    0 讨论(0)
  • 2020-11-21 23:45

    You can also use Arrays.copyOfRange.

    Example:

    public static void main(String[] args) {
        int[] a = {1,2,3};
        int[] b = Arrays.copyOfRange(a, 0, a.length);
        a[0] = 5;
        System.out.println(Arrays.toString(a)); // [5,2,3]
        System.out.println(Arrays.toString(b)); // [1,2,3]
    }
    

    This method is similar to Arrays.copyOf, but it's more flexible. Both of them use System.arraycopy under the hood.

    See:

    • https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html
    • https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
    • http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java?av=f
    0 讨论(0)
  • 2020-11-21 23:46

    You can try using Arrays.copyOf() in Java

    int[] a = new int[5]{1,2,3,4,5};
    int[] b = Arrays.copyOf(a, a.length);
    
    0 讨论(0)
  • 2020-11-21 23:48

    You can try using System.arraycopy()

    int[] src  = new int[]{1,2,3,4,5};
    int[] dest = new int[5];
    
    System.arraycopy( src, 0, dest, 0, src.length );
    

    But, probably better to use clone() in most cases:

    int[] src = ...
    int[] dest = src.clone();
    
    0 讨论(0)
提交回复
热议问题