今天在研究Jlibrtp代码时,偶然注意到里面大量使用了System.arraycopy()这个方法,心想既然是协议实现,那用的方法肯定都是效率最高或较高的了,以前对这个System.arraycopy()仅有个抽象的认识。另外,JDK中对ArrayList的add与remove方法的实现,居然也是用的System.arraycopy(),让我不由得对其产生“敬意啊”。今天就来动手试一下到底谁的效率高,到底有多高。
C程序员们经常讨论数组复制的效率,此类笔试面试题也层出不穷。在Java中,数组拷贝可以用:1)for循环;2)clone方法;3)System.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.arraycopy的4~5倍;System.arraycopy最快。
PS:System.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中,数组可以通过以下两种方式创建: 1. 声明并初始化: ```java int[] numbers = new int[5]; /...
今天,我们将讨论 Java 数组复制的四种方法,并比较它们的效率。 System.arraycopy System.arraycopy 是 Java 中最常用的数组复制方法。它可以将源数组的元素复制到目标数组中。该方法的参数包括源数组、源数组中...
本文将深入探讨.NET 6中数组拷贝的性能对比,并将其与Java语言的相应操作进行比较。了解这些知识对于优化代码效率和提升应用程序性能至关重要。 首先,我们要知道在C#中,有几种不同的方法可以实现数组拷贝: 1. *...
在这个“java数组教学及练习”中,我们将深入探讨数组的本质、一维数组的使用、多维数组的概念,以及如何处理命令行参数和数组的操作,如复制与排序。 1. **什么是数组**: 数组是Java中预定义的数据类型,它允许...
5. **数组操作**:包括拷贝数组、比较数组、数组的复制等操作。 6. **异常处理**:访问越界会抛出`ArrayIndexOutOfBoundsException`,需要进行异常处理。 7. **数组与集合框架对比**:比较数组和List、ArrayList等...
接下来,我们讨论数组拷贝。拷贝一个数组,尤其是大数组时,会涉及到两种主要策略:浅拷贝和深拷贝。浅拷贝仅仅复制了数组的引用,这意味着两个数组都指向同一块内存。因此,改变其中一个数组会影响到另一个。在C++...
在Java编程语言中,复制数组是一项常见的操作,特别是在处理数据结构和算法时。有几种不同的方法可以实现数组的复制,每种方法都有其特定的适用场景。以下将详细阐述Java中复制数组的主要方法: 1. **浅拷贝...
【Java数组基础】 Java数组是一种数据结构,用于存储同一类型的多...这些知识点涵盖了Java数组的基础,包括创建、初始化、访问、复制、异常处理以及数组作为方法参数时的行为。理解这些概念对于掌握Java编程至关重要。
在Java编程中,数组复制是常见的操作,有多种方法可以实现这一目标,包括浅复制和深复制。浅复制仅复制对象引用,而深复制则复制整个对象及其引用的对象。这里我们将详细讨论五种常见的数组复制方法,并探讨如何通过...
在这个Java数组练习题中,涉及到了数组的访问、复制、存储位置、排序、初始化、异常处理以及相关语法等多个知识点。 1. **数组的访问**:数组的元素通过下标来访问,下标是从0开始的整数,例如`array[0]`表示访问...
7. **数组拷贝与深拷贝** - `System.arraycopy()`可以用于对象数组的浅拷贝,但要注意,如果对象数组中的元素是引用类型,拷贝后的新数组只是复制了引用,而不是对象本身,因此改变其中一个数组的元素会影响到另一...
- **使用流(Stream)API**:Java 8引入的流API可以方便地实现集合到集合的复制,如`sourceList.stream().collect(Collectors.toList())`,但这仍然是浅拷贝。 - **使用`clone()`或`copy()`方法**:如果集合中的...
使用赋值运算符`=`进行数组复制实际上是浅拷贝,只复制了引用,而非数组的内容。 向方法传递数组参数时,传递的是数组的引用,而不是副本。这意味着在方法内对数组元素的修改会影响到调用方法的对象。例如: ```...
Java数组的一个关键特性是它的长度在创建时就固定了,无法在程序运行过程中改变。数组的长度可以通过Length属性来获取,该属性表示数组中元素的数量。数组的索引从0开始,最后一个元素的索引是length-1。数组的这种...
在这个文档中,我们可以看到关于Java数组的一些核心知识点。 1. **数组访问**:数组的元素通过下标来访问,下标从0开始,直到数组长度减1。例如,一个长度为5的数组,下标范围是0到4。数组Array的长度可以通过`...
首先,我们要理解Java中的对象复制有浅拷贝和深拷贝两种方式。浅拷贝只复制对象本身,不复制引用的对象;深拷贝不仅复制对象,还复制对象中引用的对象。在描述中提到的方法,很可能是关于深拷贝的实现。 在Java中,...
在Java编程语言中,复制一个目录下的所有文件到另一个目录是一项常见的任务,特别是在处理文件系统操作时。这个过程涉及到文件的遍历、读取和写入。以下将详细讲解如何实现这一功能,以及相关的Java API和技术点。 ...