`

java数组拷贝

阅读更多
java 提供的System.arrayCopy()方法比自己写的数组copy要快.

查看其源代码:

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);
   src - 源数组。
    srcPos - 源数组中的起始位置。
    dest - 目标数组。
    destPos - 目标数据中的起始位置。
    length - 要复制的数组元素的数量。
可以看到被定义为native方法...速度比自己写的普通方法要快.



在jdk1.6中加入了新的数组拷贝方法.Arrays.copyOfRange().

其源代码:

 public static byte[] copyOfRange(byte[] original, int from, int to) { 
        int newLength = to - from; 
        if (newLength < 0) 
            throw new IllegalArgumentException(from + " > " + to); 
        byte[] copy = new byte[newLength]; 
        System.arraycopy(original, from, copy, 0, 
                         Math.min(original.length - from, newLength)); 
        return copy; 
    }



其实就是System.arraycopy..晕死.



别为做的测试:

/******************************************************************************* 
 * 
 * 比较赋值与System.arraycopy谁快 
 * 
 * 复制的内容越多,System.arraycopy优势更明显 
 * 
 * Author: NeedJava 
 * 
 * Modified: 2007.09.16 
 * 
 ******************************************************************************/ 
public final class WhoFaster 
{ 
  public static void main( String[] args ) 
  { 
    /*/ 
    int begin=100;  

    int length=12;  

    String temp="12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"黑客帝国忍者神龟变形金刚" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890";  

    int times=10000000;  //千万 
    /*/ 
    int begin=100;  

    int length=120;  

    String temp="12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"黑客帝国忍者神龟变形金刚" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890" 
               +"12345678901234567890";  

    int times=1000000;  //百万 
    //*/  

    char[] oldArray=temp.toCharArray();  

    char[] newArray=null;  

    long start=0L;  


    //////////////////////////////////////////////////////////////////////////// 
    // 
    // 单纯赋值 
    // 
    //////////////////////////////////////////////////////////////////////////// 
    newArray=new char[length];  

    start=System.currentTimeMillis();  

    for( int i=0; i<times; i++ ) 
       { 
         for( int j=0; j<length; j++ ) 
            { 
              newArray[j]=oldArray[begin+j]; 
            } 
       }  

    System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );  


    //////////////////////////////////////////////////////////////////////////// 
    // 
    // System.arraycopy 
    // 
    //////////////////////////////////////////////////////////////////////////// 
    newArray=new char[length];  

    start=System.currentTimeMillis();  

    for( int i=0; i<times; i++ ) 
       { 
         System.arraycopy( oldArray, begin, newArray, 0, length ); 
       }  

    System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) ); 
  } 
}  




其结论:

在第一种情况,循环千万,一个900,一个1000,两者相差100毫秒

第二种情况就拉大了,循环千万,一个6700,一个2200,相差4500毫秒

为防止JVM将字符数组作为常量保存在内存中,我分别屏蔽运行,效果一样。

也就是说,对于很短的字符串复制,单纯赋值略快,可以忽略

对于很长的字符串复制,用单纯赋值就是脏代码

转自:http://luoyahu.iteye.com/blog/365465
分享到:
评论

相关推荐

    java数组复制的四种方法效率对比

    主要介绍了java数组复制的四种方法效率对比,文中有简单的代码示例,以及效率的比较结果,具有一定参考价值,需要的朋友可以了解下。

    java编程 java数组编程

    2.将有10个元素的数组a1 拷贝至含有15个元素的数组b1的一段位置。 3.将一个已存入数组中的值45,89,7,6,0,按0,6,7,89,45的次序打印出来。 4. 求一个3*3矩阵对角线元素之和。 5.设某个一维数组中有25个...

    Java数组编程 多个java编程

    2.将有10个元素的数组a1 拷贝至含有15个元素的数组b1的一段位置。 3.将一个已存入数组中的值45,89,7,6,0,按0,6,7,89,45的次序打印出来。 4. 求一个3*3矩阵对角线元素之和。 5.设某个一维数组中有25个...

    Java数组集合的深度复制代码实例

    主要介绍了Java数组集合的深度复制代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java基础之数组拷贝

    在java中,我们可以将一个数组变量直接拷贝给另一个数组变量。但拷贝后,两个数组变量引用的是同一个数组。若改变其中一个数组中的内容,另一个数组也会同时改变。 (注:如果想打印数组内的所有值,可以使用Arrays....

    java编程中拷贝数组的方式及相关问题分析

    主要介绍了java编程中拷贝数组的方式及相关问题分析,分享了Java中数组复制的四种方式,其次对二维数组的简单使用有一段代码示例,具有一定参考价值,需要的朋友可以了解下。

    数组与字符串.docx

    1)数组的基本操作,包括创建数组,填充数组,访问数组,拷贝数组,数组排序,数组查找。 2)编写一个猜密码的小程序,规则如下:程序首先产生一个三位数的密码,例如“025”,用户每次输入一个四位数来猜密码,程序...

    javascript中数组深拷贝途径及对象数组深拷贝

    javascript中数组深拷贝途径及对象数组深拷贝 什么是浅拷贝 在js当中,我们常常遇到数组复制的的情况,许多人一般都会使用“=”来直接把一个数组赋值给一个变量,如: var a=[1,2,3]; var b=a; console.log(b); ...

    c python java 复制数组 深浅拷贝

    直接使用 “=” 复制,浅拷贝,两个数组地址一样,改变其中一个,另一个也变化 int[] a1 = {1, 2,3}; int[] a2 = a1; a1[0] = 0; System.out.println(Arrays.toString(a1)); //[0,2,3] System.out.println(Arrays....

    实现数组复制常用的5种方式及组合类的深复制(深拷贝)

    在Java语言中,一般会采用下面的几种方法进行数组的复制。 a) for循环逐一复制; b) System.arraycopy()方法 c) Arrays.copyOf()方法 d) 使用clone()方法 e) Arrays.copyOfRange()方法 接下来,我们看下这几种方法...

    java-数组与方法及面向对象基础

    详细描述了java基础中的数组与方法的应用技术,以及面向对象的过程思想,有助于java初学者的入门学习。

    java array

    本节内容包括 数组基本概念 数组的声明与创建 数组的特性 数组拷贝 命令行参数 工具类java.util.Arrays 多维数组

    Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例

    今天小编就为大家分享一篇关于Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    java源码包---java 源码 大量 实例

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...

    java源码包2

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理...

    JAVA上百实例源码以及开源项目源代码

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...

    JAVA上百实例源码以及开源项目

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...

    java实验报告(总)

    专题二 3 总结数组拷贝的几种方法,并实现 5 专题二 4 Fibonacci数列。实践2拓展练习2.2  6 专题二 5 函数调用:素数问题 7 专题二 6 switch 8 专题二 7控制结构 9 专题二 8 数组排序 10 专题二 9合并数组 11 ...

    浅析Java中的深拷贝与浅拷贝

    浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2

Global site tag (gtag.js) - Google Analytics