本文主要分两部分:
- 手动实现数组拷贝功能
- 使用并分析System类中的数组拷贝方法
1.手动实现数组拷贝功能
首先来看看我们的需求:有两个已知数组如上图,从src数组中拷贝3,4,5,6元素到dest数组中,需求这么简单?还么完呢铁子,将元素拷到dest数组中下标从5开始的地方(也就是3拷贝到dest[5],4拷贝到dest[6]以此类推)
分析一波吧,既然是拷贝功能,你得跟我说从哪里拷到哪里吧,这决定了我们的方法应该有源数组和目标数组这两个参数,观察上图,我们发先是从源数组索引2的位置复制4个元素到目标数组从索引5到索引8位置。由此不难想到,我们的方法应该有源数组的索引位置和目标数组的索引位置。有了这四个参数发现还不能实现我们的需求。最终加了一个复制的长度。
首先我是这样写的:一个数字一个数字进行拷贝。这时候我们发现代码好像是重复的,于是乎我们就可以将这部分代码进行封装了。
这是封装好的代码,使用for循环对上方法进行封装,这样我们的手动实现数组拷贝功能就完成了。
大眼一看好像没问什么问题吗,做的挺不错。可是这个方法存在问题,最主要的问题是该方法只能拷贝int类型的数组。 由此我么
2.System类中的数组拷贝方法
通过第一部分我们知道,上面封装的方法存在局限性。工作中我们可能遇到各种各样的数据,如果一中类型封装一个方法,那不是就不符合java封装的特点了。正是由于数组拷贝方法使用场景多,所以sun公司的大佬给我们封装好了方法,也就是本文的重点arraycopy方法。该方法在System类中,是一个静态方法,所以通过类名可以直接调用,比较方便。另外System类被final修饰,是不能被实例化的,这么做也是防止大家创建对象调用静态方法。
通过查看API发现封装的时候第一个参数跟第三参数是Object类型的,也就是说该方法可以实现任意类型数组的拷贝。另外,sun公司考虑到可能出现的问题并解决,使代码更加健壮(详细看下图,或者自己打开API看看)。所以通过这个文章我想给大家传达的是我们在平时学习中,只要知道在什么类中有什么方法即可。具体的我们可以查阅API(我曾经一直不知道什么叫API,其实API就是Java的帮助文档,可以理解为java中的新华字典)。所以文档在手,天下我有。
接下来我们把arraycope拿来用一下。等等你开篇不是说不要拿来主义。这里说明一下,我们在第一部分已经有了自己的思考,在这种情况下我们是可以使用封装好的方法提高开发效率的。一个很简单的例子,大家去饭店为了什么,为了方便。没有人到饭店,自己带着食材跑到饭店后厨跟厨子说,我自己炒个玩玩你闪开,然后夸夸一顿操作,然后自己做好了,端出来自己吃。所以说,厨子能做的砸门就直接让它们做,等着吃不香吗?谁还不会泡个面加个蛋哈哈,这不是基本操作。下面是具体代码:
public static void main(String[] args) {
// 源数组
int[] src = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 目标数组
int[] dest = new int[10];
System.out.println("cope前:" + Arrays.toString(dest));
// copy(src, 2, dest, 5, 4);
System.arraycopy(src, 2, dest, 5, 4);
System.out.println("cope后:" + Arrays.toString(dest));
}
相比上面的代码是不是简单了很多,这里arraycope的c没有大写是个历史遗留问题,所以不用纠结为什么它不是arrayCope。