之前学习了List架构, 在List集合框架下大量使用了Arrays.copyOf和System.arraycopy()来做数组拷贝. 今天就来学习下Java中数组拷贝的3中方式:循环拷贝,克隆方法拷贝,System.arraycopy拷贝. 文章主要分为下面几个部分:
- 3种拷贝方式的介绍
- 3种拷贝方式的效率比较
- System.arraycopy和Arrays.copyOf()的区别
3种拷贝方式的介绍
循环拷贝
循环拷贝的形式如下:创建一个新数组,用for循环把原来数组的元素set到新的数组当中.
克隆方法拷贝
这个方式是利用数组的clone()方法来完成对数组的拷贝, 代码如下:
System.arraycopy拷贝
这个方式是创建一个新数组, 然后调用本地方法System.arraycopy来完成对新数组的拷贝. System.arraycopy的信息下面会讲到. 这种形式的代码如下:
3种拷贝方式的效率比较
代码
|
|
输出结果, 单位ms:
SIZE | copyByLoop | copyByClone | copyBySystemCopy |
---|---|---|---|
100000(10w) | 3 | 0 | 0 |
1000000(100w) | 7 | 1 | 1 |
5000000(500w) | 14 | 6 | 5 |
10000000(1kw) | 25 | 13 | 11 |
结论
- 使用for循环的方式, 将数组的每个元素进行复制或复制指定元素, 效率差;
- 使用clone方法, 效率高. 但是得到的是数组的值, 而不是引用, 又不能指定元素, 灵活性差;
- 使用System.arraycopy, 可以灵活复制, 由于是JNI方法, 效率高, 值得推荐;
System.arraycopy和Arrays.copyOf()的区别
System.arraycopy
System.arraycopy的方法声明如下:
其中,
- src: 原数组
- srcPos: 原数组开始拷贝位置
- dest: 目标数组, 也就是要拷贝的新数组
- destPos: 目标数组拷贝的开始位置
- length: 拷贝的长度
Arrays.copyOf
Arrays.copyOf的方法如下:
其中:
- original: 原数组
- newLength: 返回数组的长度, 也就是新数组长度
- newType: 返回数组的类型
区别
- System.arraycopy需要传入一个新数组, Arrays.copyOf不用传入新数组, 它会在方法内部新建数组,;
- Arrays.copyOf也是调用System.arraycopy来完成数组拷贝;