`

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 数组 PPT

    2. 深拷贝与浅拷贝:数组拷贝有深拷贝(复制整个数组及其中的元素)和浅拷贝(只复制数组引用)之分,使用`System.arraycopy()`方法可以实现深拷贝。 3. 排序:Java的`Arrays`类提供了对数组进行排序的方法,如`...

    java数组

    Java数组是程序设计中不可或缺的基础概念,它是一种数据结构,允许我们存储同类型的多个元素。在Java中,数组是对象,具有固定的大小,一旦创建,其长度就不能改变。本篇文章将深入探讨Java数组的各个方面,包括创建...

    第03讲 JAVA数组.ppt

    数组拷贝可以通过赋值操作或者使用`System.arraycopy()`方法实现。赋值操作(如`bb = aa`)只会让两个数组引用指向同一块内存,而`System.arraycopy()`方法则会真正复制数组的内容到另一块内存。 在处理大量数据时...

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

    Java数组拷贝方式及相关问题分析 Java编程中拷贝数组的方式有多种,主要可以分为四种方式:利用for循环、直接赋值、利用Arrays的copyof方法和System.arraycopy方法。 第一种方式:利用for循环 这是一种最基本的...

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

    Java 数组复制的四种方法效率对比 Java 数组复制是 Java 编程中非常重要的一个操作,它可以将源数组的元素复制到目标数组中。今天,我们将讨论 Java 数组复制的四种方法,并比较它们的效率。 System.arraycopy ...

    dotnet 6 数组拷贝性能对比.rar

    本文将深入探讨.NET 6中数组拷贝的性能对比,并将其与Java语言的相应操作进行比较。了解这些知识对于优化代码效率和提升应用程序性能至关重要。 首先,我们要知道在C#中,有几种不同的方法可以实现数组拷贝: 1. *...

    java数组资料

    "java数组资料"这个主题涵盖了Java基础知识的核心技术,特别是关于数组的知识。数组允许程序员在单个变量中存储一组相同类型的数据,这对于处理批量数据或者执行批量操作非常有用。 1. **数组的概念与定义** - ...

    java数组教学及练习

    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数组是程序设计中基础且重要的数据结构,它允许存储同一类型的数据集合。在这个“Java数组使用视频教程”中,我们将深入理解数组的内存管理、元素的创建与使用。 首先,我们来探讨“一维数组内存分析”。在Java...

    暑假培训学习笔记之java数组

    Java数组是Java编程语言中的基本概念,它是存储同类型元素集合的一种数据结构。在这个暑假培训学习笔记中,我们将深入理解Java数组的各个方面,包括定义、初始化、操作以及数组的高级特性。 1. **数组的定义** 在...

    关于数组创建以及拷贝时的内存分配

    接下来,我们讨论数组拷贝。拷贝一个数组,尤其是大数组时,会涉及到两种主要策略:浅拷贝和深拷贝。浅拷贝仅仅复制了数组的引用,这意味着两个数组都指向同一块内存。因此,改变其中一个数组会影响到另一个。在C++...

    java高端技术课程--Java数组如何实现复制

    在Java中,数组的复制分为浅拷贝和深拷贝两种。浅拷贝仅复制数组本身,不复制其元素,而深拷贝则会复制整个对象包括嵌套的对象。对于基本类型数组,复制过程就是简单的内存复制;对于引用类型数组,浅拷贝仅复制...

    Java数组的使用和学习

    Java数组是Java编程语言中基本的数据结构之一,它允许存储同一类型的多个元素。在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数组练习作业按逆序存放并输出二分法将一个数据插入到该数组二维数组对角线之和.pdf

    * 使用Array类的copyOf()方法将数组拷贝到一个新的数组中 这些知识点都是Java数组编程的基础知识,在实际开发中经常使用。 本资源涵盖了Java数组的逆序存放和输出、二分法插入数据到数组、计算二维数组对角线之和...

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

    Java数组集合的深度复制代码实例 Java数组集合的深度复制代码实例是Java程序设计中的一种重要技术,它可以将数组或集合中的数据复制到另一个数组或集合中,从而实现数据的备份或传输。本文将通过示例代码详细介绍...

    Java数组练习题目.pdf

    Java数组是程序设计中基础且重要的数据结构,用于存储同类型的数据集合。下面根据题目中的内容,详细解析Java数组的相关知识点: 1. 访问数组元素:数组的元素通过索引来访问,索引从0开始,例如`arr[0]`访问第一个...

    Java数组练习题(带答案).doc

    本文将围绕Java数组进行详细介绍,并辅以示例来加深理解。 首先,我们要了解数组的访问机制。数组是一种线性数据结构,其元素通过整数索引进行访问。数组在声明时需要指定元素类型和数组大小,一旦创建完成,其长度...

    Java数组练习题(带答案)培训讲学.docx

    在这个Java数组练习题中,涉及到了数组的多个重要知识点,包括数组的访问、复制、存储位置、异常处理以及初始化等方面。 1. **数组的访问**:数组的元素通过下标来访问,下标是从0开始的整数,例如`Array[0]`,`...

Global site tag (gtag.js) - Google Analytics