Java中數組復制的幾種方式以及數組合並


1.Object.clone()

   簡單直接,只能對源數組完整地復制

2.Arrays.copyOf(T[] original, int newLength)

   可以只復制源數組中部分元素,但復制的起始位置固定為0

3.Arrays.copyOfRange(T[] original, int from, int to)

   可以指定復制的起始位置

4.System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

   復雜,但可以將源數組中的部分元素復制到目標數組的指定位置(此方法最靈活,可實現上述1、2、3的功能)

 

1、2、3都具有一定的局限性(返回一個新的數組,無法將源數組中的元素復制到已存在的數組中),

故合並數組的操作只能通過System.arraycopy來完成,以下為示例:

JApp.java

import static java.lang.System.out;
import java.lang.reflect.Array;

public class JApp {

    //沒有使用Java中預定義的函數
//    private static int[] mergeArrays(int[]... arrays) {
//        int lengthOfNewArray = 0;
//        for (int i = 0; i < arrays.length; ++i) {
//            lengthOfNewArray += arrays[i].length;
//        }
//        int[] newArray = new int[lengthOfNewArray];
//        int index = 0;
//        for (int[] array : arrays) {
//            for (int i : array) {
//                newArray[index++] = i;
//            }
//        }
//        return newArray;
//    }
    private static <T> T[] mergeArrays(T[]... arrays) {
        int lengthOfNewArray = 0;
        for (int i = 0; i < arrays.length; ++i) {
            lengthOfNewArray += arrays[i].length;
        }
        //使用(T[])Array.newInstance(...)可避免(T[])new Object[...]引發的ClassCastException
        T[] newArray = (T[]) Array.newInstance(arrays[0].getClass().getComponentType(), lengthOfNewArray);
        int destPos = 0;
        for (int i = 0; i < arrays.length; ++i) {
            System.arraycopy(arrays[i], 0, newArray, destPos, arrays[i].length);
            destPos += arrays[i].length;
        }
        return newArray;
    }

    private static int[] mergeArrays(int[]... arrays) {
        int lengthOfNewArray = 0;
        for (int i = 0; i < arrays.length; ++i) {
            lengthOfNewArray += arrays[i].length;
        }
        int[] newArray = new int[lengthOfNewArray];
        int destPos = 0;
        for (int i = 0; i < arrays.length; ++i) {
            System.arraycopy(arrays[i], 0, newArray, destPos, arrays[i].length);
            destPos += arrays[i].length;
        }
        return newArray;
    }

    public static void main(String[] args) {
        int[] ints1 = {0, 1, 2, 3, 4};
        int[] ints2 = {5, 6, 7, 8, 9};
        int[] ints3 = {10, 11, 12, 13, 14};
        int[] buffer = new int[ints1.length + ints2.length + ints3.length];
        for (int i : buffer) {
            out.print(i + "  ");
        }
        out.println();
        System.arraycopy(ints1, 0, buffer, 0, ints1.length);
        System.arraycopy(ints2, 0, buffer, ints1.length, ints2.length);
        System.arraycopy(ints3, 0, buffer, ints1.length + ints2.length, ints3.length);
        for (int i : buffer) {
            out.print(i + "  ");
        }
        out.println();
        int[] array = mergeArrays(ints1, ints2, ints3);
        for (int i : array) {
            out.print(i + "  ");
        }
        out.println();
        Object[] objects = mergeArrays(new Object[]{"a", "b", "c"}, new Object[]{"D", "E"}, new Object[]{"測試", "Bu Ish", "布衣食"});
        for (Object o : objects) {
            out.print(o + "、");
        }
        out.println();
        String[] strings = mergeArrays(new String[]{"a", "b", "c"}, new String[]{"D", "E"}, new String[]{"測試", "Bu Ish", "布衣食"});
        for (String s : strings) {
            out.print(s + "、");
        }
        out.println();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM