Java 4种数组复制方式的性能比较

原创 2016年08月31日 16:46:53
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的源码不详,鄙人无法比较,有知道的希望不吝赐教。

版权声明:转载请注明出处——http://blog.csdn.net/chy555chy/article

相关文章推荐

java复制数组

Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。copyOf()是复制数组至指定长度,copyOfRange()方法将指定数组的指定长度复制到一个新的数组中。...

Java中最高效的读取字节文件的方法

Java中最高效的读取字节文件的方法Java中最高效的读取字节文件的方法 概述 性能比较 实验环境 实验数据 实验结论 参考资料概述在Java的FileInputStream中提供了几种从文件中读取数...
  • jpzhu16
  • jpzhu16
  • 2016年05月12日 08:55
  • 5009

java数组复制的效率

AVA语言的下面几种数组复制方法中,哪个效率最高? 正确答案: B   你的答案: D (错误) for循环逐一复制 System.arraycopy Sy...

Java数组拷贝的四种方法

Java数组拷贝java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。下...
  • abyjun
  • abyjun
  • 2015年06月10日 17:49
  • 11060

java语言复制数组的四种方法

来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? A.for循环逐一复制 B.System.arraycopy C.System.copyof D.使...

几种数组拷贝的性能

1.for循环数组拷贝方式 import java.util.Date; public class Vector1 { public static void main(String[] args) ...

深入理解ByteBuffer

ByteBuffer类是在Java NIO中常常使用的一个缓冲区类,使用它可以进行高效的IO操作,但是,如果对常用方法的理解有错误,那么就会出现意想不到的bug。...

Java之System.arraycopy方法的使用

不废话,直接看代码就全清楚了。里面 // 后面的是运行的结果 import java.util.Arrays; /** * 老紫竹JAVA提高教程 - System.arraycopy方法的使用。...

BeanUtils和Cglib的Java Bean属性copy功能的性能比较

以前将Struts中的ActionForm的属性Copy到对应的Hibernate 实体类时,我用的是BeanUtils,觉得其功能还可以,前几天学习cglib时发现它也有个bean copy的功能,...
  • redbeans
  • redbeans
  • 2005年09月29日 16:00
  • 10759

Java: 复制文件最快、高效率的方法

不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):   [java] view plaincopy private stati...
  • jdsjlzx
  • jdsjlzx
  • 2015年04月06日 11:26
  • 6854
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 4种数组复制方式的性能比较
举报原因:
原因补充:

(最多只允许输入30个字)