`
SuseLinux
  • 浏览: 26909 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java数组拷贝/复制的效率比较

    博客分类:
  • Java
 
阅读更多

今天在研究Jlibrtp代码时,偶然注意到里面大量使用了System.arraycopy()这个方法,心想既然是协议实现,那用的方法肯定都是效率最高或较高的了,以前对这个System.arraycopy()仅有个抽象的认识。另外,JDK中对ArrayListaddremove方法的实现,居然也是用的System.arraycopy(),让我不由得对其产生“敬意啊”。今天就来动手试一下到底谁的效率高,到底有多高。

C程序员们经常讨论数组复制的效率,此类笔试面试题也层出不穷。在Java中,数组拷贝可以用:1for循环;2clone方法;3System.arraycopy()。测试如下:

1)使用了一个70元素的字符串数组;

2)每种方法各循环拷贝N次。

统计结果如下:

 

重复1000

10

100

500

for循环

0

47

484

2421

clone方法

0

32

250

1235

System.arraycopy

0

16

94

437

很明显了,for循环最慢,约为clone方法的2倍,约为System.arraycopy4~5倍;System.arraycopy最快。

    PSSystem.arraycopy是调用的JNI,怪不得。

 

附测试代码:

package copytest;

public class ArrayCopyTest
{
    private static String [] src 
    = {"Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
        "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff"};
    
    private static String [] dst;

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        System.out.println(forCopy(5000000));
        System.out.println(cloneCopy(5000000));
        System.out.println(systemJNICopy(5000000));
    }
    
    /**
     * 使用for来复制数组
     * @param time 循环执行的次数
     * @return 执行的总时间
     */
    public static long forCopy(int time)
    {
        long start = System.currentTimeMillis();
        while(time-- > 0)
        {
            int size = src.length;
            dst = new String [size];
            for (int i = 0; i < size; i++)
            {
                dst[i] = src[i];
            }
        }
        long end = System.currentTimeMillis();
        return (end - start);
    }
    
    public static long cloneCopy(int time)
    {
        long start = System.currentTimeMillis();
        while(time-- > 0)
        {
            dst = (String[])src.clone();
        }
        long end = System.currentTimeMillis();
        return (end - start);
    }
    
    public static long systemJNICopy(int time)
    {
        long start = System.currentTimeMillis();
        while(time-- > 0)
        {
            int size = src.length;
            System.arraycopy(src, 0, dst, 0, size);
        }
        long end = System.currentTimeMillis();
        return (end - start);
    }

}
 
分享到:
评论

相关推荐

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

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

    java数组

    本篇文章将深入探讨Java数组的各个方面,包括创建、初始化、操作以及与其他数据结构的比较。 一、数组的创建 在Java中,数组可以通过以下两种方式创建: 1. 声明并初始化: ```java int[] numbers = new int[5]; /...

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

    今天,我们将讨论 Java 数组复制的四种方法,并比较它们的效率。 System.arraycopy System.arraycopy 是 Java 中最常用的数组复制方法。它可以将源数组的元素复制到目标数组中。该方法的参数包括源数组、源数组中...

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

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

    java数组教学及练习

    在这个“java数组教学及练习”中,我们将深入探讨数组的本质、一维数组的使用、多维数组的概念,以及如何处理命令行参数和数组的操作,如复制与排序。 1. **什么是数组**: 数组是Java中预定义的数据类型,它允许...

    java数组使用视频教程

    5. **数组操作**:包括拷贝数组、比较数组、数组的复制等操作。 6. **异常处理**:访问越界会抛出`ArrayIndexOutOfBoundsException`,需要进行异常处理。 7. **数组与集合框架对比**:比较数组和List、ArrayList等...

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

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

    java 复制数组的资源

    在Java编程语言中,复制数组是一项常见的操作,特别是在处理数据结构和算法时。有几种不同的方法可以实现数组的复制,每种方法都有其特定的适用场景。以下将详细阐述Java中复制数组的主要方法: 1. **浅拷贝...

    java数组练习题目 (2).docx

    【Java数组基础】 Java数组是一种数据结构,用于存储同一类型的多...这些知识点涵盖了Java数组的基础,包括创建、初始化、访问、复制、异常处理以及数组作为方法参数时的行为。理解这些概念对于掌握Java编程至关重要。

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

    在Java编程中,数组复制是常见的操作,有多种方法可以实现这一目标,包括浅复制和深复制。浅复制仅复制对象引用,而深复制则复制整个对象及其引用的对象。这里我们将详细讨论五种常见的数组复制方法,并探讨如何通过...

    Java数组练习题.docx

    在这个Java数组练习题中,涉及到了数组的访问、复制、存储位置、排序、初始化、异常处理以及相关语法等多个知识点。 1. **数组的访问**:数组的元素通过下标来访问,下标是从0开始的整数,例如`array[0]`表示访问...

    对象数组 java

    7. **数组拷贝与深拷贝** - `System.arraycopy()`可以用于对象数组的浅拷贝,但要注意,如果对象数组中的元素是引用类型,拷贝后的新数组只是复制了引用,而不是对象本身,因此改变其中一个数组的元素会影响到另一...

    java不同对象及集合的多次复制

    - **使用流(Stream)API**:Java 8引入的流API可以方便地实现集合到集合的复制,如`sourceList.stream().collect(Collectors.toList())`,但这仍然是浅拷贝。 - **使用`clone()`或`copy()`方法**:如果集合中的...

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

    使用赋值运算符`=`进行数组复制实际上是浅拷贝,只复制了引用,而非数组的内容。 向方法传递数组参数时,传递的是数组的引用,而不是副本。这意味着在方法内对数组元素的修改会影响到调用方法的对象。例如: ```...

    java关于数组(学习笔记)

    Java数组的一个关键特性是它的长度在创建时就固定了,无法在程序运行过程中改变。数组的长度可以通过Length属性来获取,该属性表示数组中元素的数量。数组的索引从0开始,最后一个元素的索引是length-1。数组的这种...

    Java_数组练习答案 (2).docx

    在这个文档中,我们可以看到关于Java数组的一些核心知识点。 1. **数组访问**:数组的元素通过下标来访问,下标从0开始,直到数组长度减1。例如,一个长度为5的数组,下标范围是0到4。数组Array的长度可以通过`...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    首先,我们要理解Java中的对象复制有浅拷贝和深拷贝两种方式。浅拷贝只复制对象本身,不复制引用的对象;深拷贝不仅复制对象,还复制对象中引用的对象。在描述中提到的方法,很可能是关于深拷贝的实现。 在Java中,...

    java实现一个目录下全部文件复制到另一目录

    在Java编程语言中,复制一个目录下的所有文件到另一个目录是一项常见的任务,特别是在处理文件系统操作时。这个过程涉及到文件的遍历、读取和写入。以下将详细讲解如何实现这一功能,以及相关的Java API和技术点。 ...

Global site tag (gtag.js) - Google Analytics