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 NIO中的缓冲区Buffer(二)创建-复制缓冲区

创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1、调用allocate方法 2、调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义; allocate方法创建缓冲区 ...
  • aiwuzhi12
  • aiwuzhi12
  • 2017年03月04日 09:17
  • 490

关于System.arraycopy数组复制的一个问题

本小节主要讲的是数组复制的一个问题 在EClipse里面输入System.arraycopy会自动显示: System.arraycopy(src, srcPos, dest, destPos, le...
  • qq_30175203
  • qq_30175203
  • 2015年09月24日 17:11
  • 863

Java Buffer类详解

Buffer 类是 java.nio 的构造基础。一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索。缓冲区可以被写满或释放。对于...
  • luming_xml
  • luming_xml
  • 2016年05月10日 14:07
  • 1124

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

不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):   [java] view plaincopy private stati...
  • jdsjlzx
  • jdsjlzx
  • 2015年04月06日 11:26
  • 7988

老紫竹JAVA提高教程-System.arraycopy方法的使用

 不废话,直接看代码就全清楚了。里面 // 后面的是运行的结果 import java.util.Arrays;/** * 老紫竹JAVA提高教程 - System.arraycopy方法的使用。 *...
  • java2000_net
  • java2000_net
  • 2009年04月09日 14:23
  • 41374

Java方法之--System.arraycopy方法和Arrays.copyOf()

System.arraycopy方法:如果是数组比较大,那么使用System.arraycopy会比较有优势,因为其使用的是内存复制,省去了大量的数组寻址访问等时间 public static na...
  • oChangWen
  • oChangWen
  • 2016年01月26日 16:10
  • 15530

使用buffer拷贝文件

package com.zyf.day20; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; imp...
  • china_demon
  • china_demon
  • 2016年12月27日 04:37
  • 222

Java如何实现文件拷贝操作和如何正确关闭资源

http://blog.csdn.net/caidie_huang/article/details/52738225 使用字节流完成文件的拷贝: 使用字节输入流(FileInputStream)将源...
  • lzh657083979
  • lzh657083979
  • 2017年08月01日 13:23
  • 556

关于java数组拷贝的性能

java 提供的System.arrayCopy()方法比自己写的数组copy要快.查看其源代码:public static native void arraycopy(Object src,  in...
  • luoyahu
  • luoyahu
  • 2008年11月18日 09:15
  • 20354

Java数组/集合性能优化

1、 复制数组元素,使用System类arraycopy()方法替代循环赋值在数组之间复制元素 建议:System类arraycopy()方法复制数组元素 杜绝:循环赋值复制数组元素 原因: Sy...
  • u012099645
  • u012099645
  • 2015年12月01日 10:30
  • 922
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 4种数组复制方式的性能比较
举报原因:
原因补充:

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