手记

System.arraycopy和Arrays.copyOf的原理解剖

数组的复制其实在很多业务情况下会用到,不同的业务情况下选择适合的方式来实施复制是每个开发人员要考虑的事情。

那么System.arraycopyArrays.copyOf到底是如何复制的呢?接下来就一起来讨论一下吧。


arraycopy

arraycopy是System提供的native静态方法,方法原型如下;

public static native void arraycopy(Object arg,int arg0,Object arg1,int arg2,int arg3);

参数arg:源数组对象

arg0:源数组的起始位置

arg1:目标数组对象

arg2:目标数组的起始位置

arg3:要复制的元素数量


copyOf

Arrays类中存在着copyOf的很多种实现方式,在进行数组的复制过程中,我们只需要调用其中一种即可,调用方式如下;

Arrays.copyOf(elementData, size);

参数elementData:源数组对象

size:目标数组的长度

来看一下copyOf的源码,如下;

public static <T> T[] copyOf(T[] arg,int arg0) {
   return (Object[]) copyOf(arg,arg0,arg.getClass());
}	
public static <T, U> T[] copyOf(U[] arg, int arg0,Class<? extends T[]> arg1){
  Object[] arg2 = arg1 == Object[].class ? 
        (Object[]) (new Object[arg0]): 
        (Object[]) ((Object[]) Array.newInstance(arg1.getComponentType(), arg0));
  System.arraycopy(arg,0,arg2,0,Math.min(arg.length, arg0));
  return arg2;	
}

首先,创建了一个和源数组元素相同类型的新数组;

接着调用了System.arraycopy函数,并且在arraycopy函数最后一个参数(要复制的元素数量)取了设置的size源数组长度两者的最小值

最后返回了新数组


欢迎关注微信公众号:Ijiran的编程思维。不定时分享面试经验、各大公司面试题、
Java源码解析、jquery原理分析等文章,关注微信公众号可以及时获得技术文章、面试资源推送。
0人推荐
随时随地看视频
慕课网APP