Java中copy數組的方法有四種。第一種是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; } }
通過對以上代碼的運行,雖然每次運行結果不穩定,但總體可以得出以下結論:
System.arrayCopy()(7毫秒)>clone()(16毫秒)>Arrays.copyOf()(18毫秒)>for循環(20毫秒)