java中,数组的复制有以下三种方式:

1. 调用System.arraycopy(Arrays.copyOfRange可以当作第四种,但是底层调用的是System.arraycopy,所以,认为是同一种,下面是Arrays.copyOfRange的方法实现)

 public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {int newLength = to - from;if (newLength < 0)throw new IllegalArgumentException(from + " > " + to);T[] copy = ((Object)newType == (Object)Object[].class)? (T[]) new Object[newLength]: (T[]) Array.newInstance(newType.getComponentType(), newLength);System.arraycopy(original, from, copy, 0,Math.min(original.length - from, newLength));return copy;}

2. 调用clone方法

3.利用for循环自己实现

效率比较上,通过下面程序可以看出

/*** */
package collection;import java.util.Arrays;
import java.util.Date;/*** @author yfei* Date:2013-8-26*/
public class Array {public static final int size = 1000000;public static void copyByArrayCopy(String[] strArray){Long startTime = System.currentTimeMillis();String[] destArray = new String[size];System.arraycopy(strArray,0,destArray,0,strArray.length);//printArr(destArray);Long endTime = System.currentTimeMillis();System.out.println("copyByArrayCopy cost time is "+(endTime-startTime));}public static void copyByLoop(String[] strArray){Long startTime = System.currentTimeMillis();String[] destArray = new String[size];for(int i = 0;i<strArray.length;i++){destArray[i] = strArray[i];}//printArr(destArray);Long endTime = System.currentTimeMillis();System.out.println("copyByLoop cost time is "+(endTime-startTime));}public static void copyByClone(String[] strArray){Long startTime = System.currentTimeMillis();String[] destArray = strArray.clone();Long endTime = System.currentTimeMillis();System.out.println("copyByClone cost time is "+(endTime-startTime));}public static void main(String args[]){String arr1[] = new String[size];for(int i=0;i<size;i++){arr1[i] = "this is a test"+i;//arr1[i] = "shishangzhiyoumamahaoyouamdehaizixiangkuaibaotoujinmamadehuaibaoxingfuxiangbuliaoshishangzhiyoumamahaomeimadehaizixianggencaolikaimamadehuaibaoxingfunalizhaoshishangzhiyoumamahaomeimadehaizibuzhidaoyaoshitazhidaomengliyehuixiao"+i;}String arr2[] = new String[size];for(int i=0;i<size;i++){arr2[i] = "this is a test"+i;//arr2[i] = "shishangzhiyoumamahaoyouamdehaizixiangkuaibaotoujinmamadehuaibaoxingfuxiangbuliaoshishangzhiyoumamahaomeimadehaizixianggencaolikaimamadehuaibaoxingfunalizhaoshishangzhiyoumamahaomeimadehaizibuzhidaoyaoshitazhidaomengliyehuixiao"+i;}String arr3[] = new String[size];for(int i=0;i<size;i++){arr3[i] = "this is a test"+i;//arr3[i] = "shishangzhiyoumamahaoyouamdehaizixiangkuaibaotoujinmamadehuaibaoxingfuxiangbuliaoshishangzhiyoumamahaomeimadehaizixianggencaolikaimamadehuaibaoxingfunalizhaoshishangzhiyoumamahaomeimadehaizibuzhidaoyaoshitazhidaomengliyehuixiao"+i;}copyByClone(arr1);copyByLoop(arr2);copyByArrayCopy(arr3);}public static void printArr(String[] strArray){for(String str:strArray){System.out.println(str);}}
}

结果(ms单位):

copyByClone cost time is 2
copyByLoop cost time is 352
copyByArrayCopy cost time is 3

由此可以看出,clone和arraycopy的效率基本是一致的,而通过循环copy的效率最慢。

看了一下源代码:

clone:

 protected native Object clone() throws CloneNotSupportedException;

arraycopy

 public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

两种方式都是用native  method。

简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。

java的性能是不能言说的伤啊。。。

转载于:https://www.cnblogs.com/james1207/p/3283397.html

java数组复制的方式和效率比较相关推荐

  1. 回顾java数组复制

    在写这篇文章之前,也看了一些别人写的,基本上都是大同小异.文章是对java数组复制基础知识的回顾,算是作为学习笔记,供以后自己翻阅. 首先,简单想一下这个问题:为什么要复制数组? 我的个人理解:在我们 ...

  2. Java数组的定义方式有哪几种

    今天动力节点java培训机构小编为大家分享Java数组的定义方式有哪几种,希望通过此文,大家能够熟知java数组的定义方式,下面就是小编一起看看Java数组的定义方式有哪几种呢? Java数组定义方式 ...

  3. java数组复制_Java自学-数组 复制数组

    Java 如何复制数组 数组的长度是不可变的,一旦分配好空间,是多长,就多长,不能增加也不能减少 步骤 1 : 复制数组 把一个数组的值,复制到另一个数组中 System.arraycopy(src ...

  4. java数组初始化的方式_java数组初始化方式

    在使用一个新的数组之前,要先对其中的数值进行设置,也就是我们常说的初始化工作.因为数组有长度和内容的区分,所以常见的两种初始化方法是动态和静态,另外一种就是默认初始化.下面我们对数组的初始化概念进行理 ...

  5. java数组的初始化方式

    //java数组长度必须在初始化时给定,长度不可变//第一种 int[] a = new int[100]; for(int i = 0;i<a.length;i++){a[i] = i; }/ ...

  6. java数组初始化的方式,java中初始化数组的方式有几种

    java中初始化数组的方式有几种 发布时间:2020-06-01 16:12:45 来源:亿速云 阅读:153 作者:鸽子 三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 ...

  7. java几种遍历方式以及效率对比

    几种遍历方式: /*** */ package effectiveUse;import java.util.Iterator; import java.util.List;/*** @author w ...

  8. java数组复制用for_在JavaScript中复制数组的最快方法 - 切片与'for'循环

    这取决于阵列的长度 . 如果数组长度<= 1,000,000, slice 和 concat 方法大约需要相同的时间 . 但是当你给出更广泛的范围时, concat 方法获胜 . 例如,尝试以下 ...

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

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...

最新文章

  1. 1.4-puppet配置证书
  2. 4.3.2 IP数据报分片
  3. JS获取当前/指定URL参数
  4. Python3编写网络爬虫04-爬取猫眼电影排行实例
  5. linux命令之查看程序动态库依赖-ldd
  6. 应届毕业生突破909万,数据盘点哪行工资最高,有你心仪的吗?
  7. spring框架文档学习(包会)
  8. kmeans算法中的sse_聚类算法入门:k-means
  9. C++:获取图片文件信息-图片名称、类型、像素宽高
  10. 留学计算机美国硕士,美国硕士留学计算机专业有哪些名校推荐下?
  11. SPOJ QTREE
  12. Android之Camera拍照
  13. 数据结构算法题整理3
  14. 图解Linux下如何搭建C#开发环境
  15. IEEE论文模板(latex/word)
  16. java 连线题_java练习题
  17. 各类排序算法比较分析
  18. wps图表横纵坐标怎么设置_wps怎么切换横纵坐标/excel图表怎么切换横纵坐标
  19. Camera 360应用隐私数据泄露的分析
  20. 【Chrome扩展程序】解决“只能通过Chrome网上应用商店安装该程序”的方法

热门文章

  1. c语言编程数学黑洞,一个数学黑洞——6174
  2. python gitlab_Python Gitlab Api 使用方法
  3. js读取外部json指定字段值完整代码_前端工程化 剖析npm的包管理机制(完整版)...
  4. PHP怎样表示几时几分,PHP将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分......
  5. 光纤中继器的防雷及日常维护方法介绍
  6. 交换机组最常见的8大故障及解决方法
  7. [渝粤教育] 中国地质大学 企业文化建设与管理 复习题
  8. 【渝粤教育】电大中专电大中专沟通技巧考试考核试题 (2)作业 题库
  9. 【渝粤题库】陕西师范大学209011商业银行信贷管理Ⅱ 作业(专升本)
  10. 【渝粤题库】国家开放大学2021春2625调剂学题目