四中copy数组方法的效率比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四中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;
	}
}

	

技术分享通过对以上代码的运行,虽然每次运行结果不稳定,但总体可以得出以下结论:

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

本文出自 “java” 博客,请务必保留此出处http://a001807.blog.51cto.com/9804844/1905265

以上是关于四中copy数组方法的效率比较的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB7--游标cursor

Python 中 copy.copy 的效率

Avtivity的四中启动模式

VsCode 代码片段-提升研发效率

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法