Java中數(shù)組復(fù)制的四種方法

for()循環(huán)方法

代碼靈活,但效率低。

System.arraycopy()方法(推薦使用)

該方法是淺拷貝,也就是說(shuō)對(duì)于非基本類(lèi)型而言,拷貝的是對(duì)象的引用,而不是去新建一個(gè)新的對(duì)象。
通過(guò)源碼可以看到,其為 native方法,即原生態(tài)方法,是調(diào)用底層的 C 或者 C++ 實(shí)現(xiàn)的,自然效率更高。

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

Arrays.copyOf()方法

同樣看源碼,它的實(shí)現(xiàn)還是基于 System.arraycopy(),所以效率自然低于 System.arraycpoy()。 同樣,這個(gè)方法也是淺拷貝。

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

Object.clone()方法

該方法比較特殊,對(duì)于對(duì)象而言,它是深拷貝,但是對(duì)于數(shù)組而言,它是淺拷貝。
從源碼來(lái)看是 native 方法,所以是調(diào)用了 C 或者 C++ 代碼。

    protected native Object clone() throws CloneNotSupportedException;

方法性能測(cè)試比較

import java.util.Arrays;
import java.util.Random;

/**
 * 數(shù)組復(fù)制的方法比較
 *
 * @author TinyDolphin
 *         2017/11/1 15:40.
 */
public class Main {
    public static void main(String[] args) {
        // int length = 10000000;    // 千萬(wàn)級(jí)別
        int length = 8000000;        // 百萬(wàn)級(jí)別
        Integer[] arr = new Integer[length];
        Integer[] arr2 = new Integer[length];
        for (int index = 0; index < length; index++) {
            arr[index] = new Random().nextInt(length) + 1;
        }

        // for() 循環(huán)方法
        long start = System.currentTimeMillis();
        for (int index = 0; index < length; index++) {
            arr2[index] = arr[index];
        }
        long end = System.currentTimeMillis();
        System.out.println("for()循環(huán)方法耗費(fèi)時(shí)間:" + (end - start) + "ms");

        // Object.clone() 方法
        start = System.currentTimeMillis();
        arr2 = arr.clone();
        end = System.currentTimeMillis();
        System.out.println("Object.clone()方法耗費(fèi)時(shí)間:" + (end - start) + "ms");

        // Arrays.copyOf() 方法
        start = System.currentTimeMillis();
        arr2 = Arrays.copyOf(arr, length);
        end = System.currentTimeMillis();
        System.out.println("Arrays.copyOf()方法耗費(fèi)時(shí)間:" + (end - start) + "ms");

        // System.arraycopy() 方法
        start = System.currentTimeMillis();
        System.arraycopy(arr, 0, arr2, 0, length);
        end = System.currentTimeMillis();
        System.out.println("System.arraycopy()方法耗費(fèi)時(shí)間:" + (end - start) + "ms");
    }
}

數(shù)據(jù)量百萬(wàn)級(jí)別的情況下:

百萬(wàn)級(jí)別測(cè)試結(jié)果

數(shù)據(jù)量是千萬(wàn)級(jí)別的情況下:

千萬(wàn)級(jí)別測(cè)試結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,899評(píng)論 18 399
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評(píng)論 25 708
  • 下班的打卡聲 擠過(guò)了人群 出站口,凝望天空 晚七點(diǎn)五十,天還沒(méi)黑
    郭青年閱讀 261評(píng)論 0 1
  • 社會(huì)的進(jìn)步,經(jīng)濟(jì)的繁榮,給了我們良好的生活條件,同時(shí)也使我們的工作壓力和生活壓力加大,進(jìn)而影響我們的情緒和身體健康...
    安好007閱讀 26,368評(píng)論 0 5
  • 在療愈水晶的世界中,有些特別的水晶伙伴被歸類(lèi)為大師水晶的行列,它們以完美的形態(tài)存在,顯現(xiàn)與光之源的合一。每一顆大師...
    GaiaMama閱讀 20,633評(píng)論 0 30

友情鏈接更多精彩內(nèi)容