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数组复制的四种方法效率对比,文中有简单的代码示例,以及效率的比较结果,具有一定参考价值,需要的朋友可以了解下。
2.将有10个元素的数组a1 拷贝至含有15个元素的数组b1的一段位置。 3.将一个已存入数组中的值45,89,7,6,0,按0,6,7,89,45的次序打印出来。 4. 求一个3*3矩阵对角线元素之和。 5.设某个一维数组中有25个...
2.将有10个元素的数组a1 拷贝至含有15个元素的数组b1的一段位置。 3.将一个已存入数组中的值45,89,7,6,0,按0,6,7,89,45的次序打印出来。 4. 求一个3*3矩阵对角线元素之和。 5.设某个一维数组中有25个...
主要介绍了Java数组集合的深度复制代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在java中,我们可以将一个数组变量直接拷贝给另一个数组变量。但拷贝后,两个数组变量引用的是同一个数组。若改变其中一个数组中的内容,另一个数组也会同时改变。 (注:如果想打印数组内的所有值,可以使用Arrays....
主要介绍了java编程中拷贝数组的方式及相关问题分析,分享了Java中数组复制的四种方式,其次对二维数组的简单使用有一段代码示例,具有一定参考价值,需要的朋友可以了解下。
1)数组的基本操作,包括创建数组,填充数组,访问数组,拷贝数组,数组排序,数组查找。 2)编写一个猜密码的小程序,规则如下:程序首先产生一个三位数的密码,例如“025”,用户每次输入一个四位数来猜密码,程序...
javascript中数组深拷贝途径及对象数组深拷贝 什么是浅拷贝 在js当中,我们常常遇到数组复制的的情况,许多人一般都会使用“=”来直接把一个数组赋值给一个变量,如: var a=[1,2,3]; var b=a; console.log(b); ...
直接使用 “=” 复制,浅拷贝,两个数组地址一样,改变其中一个,另一个也变化 int[] a1 = {1, 2,3}; int[] a2 = a1; a1[0] = 0; System.out.println(Arrays.toString(a1)); //[0,2,3] System.out.println(Arrays....
在Java语言中,一般会采用下面的几种方法进行数组的复制。 a) for循环逐一复制; b) System.arraycopy()方法 c) Arrays.copyOf()方法 d) 使用clone()方法 e) Arrays.copyOfRange()方法 接下来,我们看下这几种方法...
详细描述了java基础中的数组与方法的应用技术,以及面向对象的过程思想,有助于java初学者的入门学习。
本节内容包括 数组基本概念 数组的声明与创建 数组的特性 数组拷贝 命令行参数 工具类java.util.Arrays 多维数组
今天小编就为大家分享一篇关于Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、...
专题二 3 总结数组拷贝的几种方法,并实现 5 专题二 4 Fibonacci数列。实践2拓展练习2.2 6 专题二 5 函数调用:素数问题 7 专题二 6 switch 8 专题二 7控制结构 9 专题二 8 数组排序 10 专题二 9合并数组 11 ...
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2