java陣列拷貝哪個效率高
阿新 • • 發佈:2019-02-13
之前看到很多問題以及很多部落格都有討論java陣列拷貝的效率問題,一般都是討論如下幾種方法
int[] b=a.clone();
System.arraycopy(a, 0, b, 0, n);
int[] b=Arrays.copyOf(a, n);
int[] b=Arrays.copyOfRange(a, 0, n);
for
下面做了個測試:拷貝的陣列長度為10000個int型資料
測試程式碼如下:
package test; import java.util.Arrays; public class ArrayClone { public static void testClone() { int n=10000; int[] a= new int[n]; for(int i=0;i<n;i++) { a[i]=i; } long beginTime = System.nanoTime(); int[] b=a.clone(); long endTime = System.nanoTime(); System.out.println("a.clone()運行了"+(endTime-beginTime)+"ns"); System.out.println(b[n-1]); } public static void testSystemArrayCopy() { int n=10000; int[] a= new int[n]; for(int i=0;i<n;i++) { a[i]=i; } int[] b= new int[n]; long beginTime = System.nanoTime(); // 引數含義:(原陣列, 原陣列的開始位置, 目標陣列, 目標陣列的開始位置, 拷貝個數) System.arraycopy(a, 0, b, 0, n); long endTime = System.nanoTime(); System.out.println("System.arraycopy()運行了"+(endTime-beginTime)+"ns"); System.out.println(b[n-1]); } //Arrays.copyOf底層其實也是用的System.arraycopy public static void testArraysCopyof() { int n=10000; int[] a= new int[n]; for(int i=0;i<n;i++) { a[i]=i; } long beginTime = System.nanoTime(); // 引數含義:(原陣列,拷貝的個數) int[] b=Arrays.copyOf(a, n); long endTime = System.nanoTime(); System.out.println("Arrays.copyOf()運行了"+(endTime-beginTime)+"ns"); System.out.println(b[n-1]); } //Arrays.copyOfRange底層其實也是用的System.arraycopy,只不過封裝了一個方法 public static void testCopyOfRange() { int n=10000; int[] a= new int[n]; for(int i=0;i<n;i++) { a[i]=i; } long beginTime = System.nanoTime(); // 引數含義:(原陣列,開始位置,拷貝的個數) int[] b=Arrays.copyOfRange(a, 0, n); long endTime = System.nanoTime(); System.out.println("Arrays.copyOfRange()運行了"+(endTime-beginTime)+"ns"); System.out.println(b[n-1]); } public static void testFor() { int n=10000; int[] a= new int[n]; for(int i=0;i<n;i++) { a[i]=i; } int[] b= new int[n]; long beginTime = System.nanoTime(); for(int i=0;i<a.length;i++) { b[i]=a[i]; } long endTime = System.nanoTime(); System.out.println("for迴圈運行了"+(endTime-beginTime)+"ns"); System.out.println(b[n-1]); } public static void main(String[] args) { testClone(); testSystemArrayCopy(); testArraysCopyof(); testCopyOfRange(); testFor(); } }
執行結果如下:
PS:粗淺認為是效能優劣排序為System.arraycopy>clone約等於Arrays.copyOfRange>Arrays.copyOf>for,其中Arrays.copyOfRange(PS:其實記住System.arraycopy快,for慢就差不多了)與Arrays.copyOf原始碼都是使用System.arraycopy(如下圖所示)。
經常看到這類部落格,有詳細的描述也有粗淺的比較,今天心血來潮動手試試,這種感覺和看部落格、記概念是不一樣的,挺好。
函式的詳細使用,網路資料不少,在此我就不摘抄了。