四中copy數組方法的效率比較

Javacopy數組的方法有四種。第一種是Object類提供的clone( )方法,第二種是java.lang.System類提供的arrayCopy( )方法,第三種是java.util.Arrays類提供的copyOf( )方法,最後一種也就是最常見的使用for循環實現數組的copy。四中執行方法由於內部實現不同當然有不同的執行效率。參考下面代碼的運行結果(由於用到了相同的業務邏輯所以使用了動態代理)

代理類:

package com.zly.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class Agent implements InvocationHandler{
	
	private ArrayCopyMethodCompareInterface acmc1= new ArrayCopyMethodCompare1(); 
	
	
	
	public ArrayCopyMethodCompareInterface getAcmc1() {
		return acmc1;
	}



	public void setAcmc1(ArrayCopyMethodCompareInterface acmc1) {
		this.acmc1 = acmc1;
	}



	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		long startTime = System.currentTimeMillis();
		method.invoke(acmc1, args);
		long endTime = System.currentTimeMillis();
		System.out.println(endTime-startTime);
		return null;
	}

}

被代理接口:

package com.zly.test;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public interface ArrayCopyMethodCompareInterface {
public void system_arraycopy();
public void for_copy();
public void clone_copy();
public void arrays_copyof();
}

被代理接口實現類:

package com.zly.test;

import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ArrayCopyMethodCompare1 implements ArrayCopyMethodCompareInterface{
	
	public static int[] a = new int[2000000];
	public int[] b = new int[a.length];
	

	public static void main(String[] args) {
		
		for(int i=0;i<a.length;i++) {
			a[i]=i+1;
		}
		
		ArrayCopyMethodCompareInterface acmc = new ArrayCopyMethodCompare1();
		Agent a = new Agent();
		a.setAcmc1(acmc);
		ArrayCopyMethodCompareInterface arrayCopyMethodCompareProxy = (ArrayCopyMethodCompareInterface)Proxy.
				newProxyInstance(acmc.getClass().getClassLoader(),new Class[]{ArrayCopyMethodCompareInterface.class}, a);
		
		arrayCopyMethodCompareProxy.clone_copy();
		/*arrayCopyMethodCompareProxy.for_copy();
		arrayCopyMethodCompareProxy.system_arraycopy();
		arrayCopyMethodCompareProxy.arrays_copyof();*/
		
	}
	
	public void system_arraycopy() {
		System.arraycopy(a, 0, b, 0, a.length);
		b=null;
	}
	
	public void for_copy() {
		for(int i=0;i<a.length-1;i++) {
			b[i]=a[i];
		}
		b=null;
	}

	public void clone_copy() {
		b=a.clone();
		b=null;
	}
	
	public void arrays_copyof() {
		b=Arrays.copyOf(a, a.length);
		b=null;
	}
}

	

spacer.gif通過對以上代碼的運行,雖然每次運行結果不穩定,但總體可以得出以下結論:

System.arrayCopy()7毫秒)>clone()16毫秒)>Arrays.copyOf()18毫秒)>for循環(20毫秒)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章