Java 4种数组复制方式的性能比较
2023-09-11 14:22:55 时间
package com.demo.main;
import java.util.Arrays;
/**
* <ol>复制数组的4种方法
* <li>for</li>
* <li>clone</li>
* <li>Arrays.copyOf(original, newLength)</li>
* <li>System.arraycopy(src, srcPos, dest, destPos, length)</li>
* </ol>
*/
public class ArrayCopyDemo {
private static final byte[] buffer = new byte[1024*10];
static {
for (int i = 0; i < buffer.length; i++) {
buffer[i] = (byte) (i & 0xFF);
}
}
private static long startTime;
public static void main(String[] args) {
startTime = System.nanoTime();
methodFor();
calcTime("methodFor");
startTime = System.nanoTime();
methodClone();
calcTime("methodClone");
startTime = System.nanoTime();
methodArraysCopyOf();
calcTime("methodArraysCopyOf");
startTime = System.nanoTime();
methodSystemArraycopy();
calcTime("methodSystemArraycopy");
}
private static void methodFor() {
byte[] newBuffer = new byte[buffer.length];
for(int i=0;i<buffer.length;i++) {
newBuffer[i] = buffer[i];
}
}
private static void methodClone() {
byte[] newBuffer = buffer.clone();
}
private static void methodArraysCopyOf() {
byte[] newBuffer = Arrays.copyOf(buffer, buffer.length);
}
private static void methodSystemArraycopy() {
byte[] newBuffer = new byte[buffer.length];
System.arraycopy(buffer, 0, newBuffer, 0, buffer.length);
}
private static void calcTime(String method) {
long endTime = System.nanoTime();
System.out.println(method + " cost " +(endTime-startTime)+ " nanosecond");
}
}
总结:
(1)从速度上看:System.arraycopy > clone > Arrays.copyOf > for
(2)for的速度之所以最慢是因为下标表示法每次都从起点开始寻位到指定下标处(现代编译器应该对其有进行优化,改为指针),另外就是它每一次循环都要判断一次是否达到数组最大长度和进行一次额外的记录下标值的加法运算。
(3)查看Arrays.copyOf的源码可以发现,它其实本质上是调用了System.arraycopy。之所以时间差距比较大,是因为很大一部分开销全花在了Math.min函数上了。
public static byte[] copyOf(byte[] original, int newLength) {
byte[] copy = new byte[newLength];
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
(4)查看System.arraycopy的源码,可以发现它实质上是通过Jni调用本地方法,及c/c++已经编译成机器码的方法,所以快。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
(5)clone的源码不详,鄙人无法比较,有知道的希望不吝赐教。
相关文章
- Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript
- java集合(3)- Java中的equals和hashCode方法详解
- 【JAVA】JSP操作数据库简单实例和mysql-connector-java-5.0.3-bin.jar项目配置方法
- 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
- Java使用list集合remove需要注意的事项
- [转]java生成 excel 并导出文件
- 坑——java的String.split()方法
- Ubuntu安装java的几种方式以及多个JAVA版本的切换
- JAVA面试八股文
- 多家大厂JAVA面试题整理分布式+微服务+高并发+性能优调+框架源码
- Tomcat 奔溃:java.lang.OutOfMemoryError: Java heap space
- (Java实习生)每日10道面试题打卡——JavaWeb篇
- 1. java.util.concurrent - Java 并发工具包
- java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好
- Java条形码生成技术-Barcode4j
- Java学习-057-Jsoup爬虫获取中国所有的三级行政区划数据(二),并生成数据库 SQL 脚本插入语句
- java vector的多线程安全是否有用
- Java项目性能瓶颈定位
- java.lang.OutOfMemoryError: Java heap space解决方法
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- java 多态的好处
- (JAVA编程练习):两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。抽签名单已经决定,有人向队员打听比赛名单。a说他不和x比,c说他不和x,z比,编写程序找出比赛名单。
- 『Java练习生的自我修养』java-se进阶⁵ • 常用IO流
- Java学习---JAVA的类设计
- java代码实现获取微信小程序码并返回图片地址
- 华为OD机试 -字母计数(Java) | 机试题+算法思路+考点+代码解析 【2023】
- 【JAVA】重写、重载与继承
- Java小白入门200例36之Java实现字符串大小写转换
- Java多线程-简单使用Lock(锁)