1. 程式人生 > >java陣列拷貝哪個效率高

java陣列拷貝哪個效率高

之前看到很多問題以及很多部落格都有討論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(如下圖所示)。

經常看到這類部落格,有詳細的描述也有粗淺的比較,今天心血來潮動手試試,這種感覺和看部落格、記概念是不一樣的,挺好。

函式的詳細使用,網路資料不少,在此我就不摘抄了。