java中数组复制的4种方式分析
2017-08-21 10:30
603 查看
注意:这里讨论的速率是一般情况下的,也就是大多数是这样的,我们一般情况也可这么认为,但凡事不能说绝对,总有不知道哪一天它真的出现了一次例外,也不是没有可能。
1、4种方式都包括什么?
(1)利用clone()方法进行复制
(2)利用copyOf(int[] original, int newLength)方法进行复制
(3)利用arraycopy(Object src, int srcPos,Object dest, int destPos,int length)方法进行复制
(4)利用for循环进行复制.
2、用时比较:(3)<(2)<(1),(4)通常是在(1)后面的,但是有的测试用例(4)在(2)和(1)之间,但(3)肯定是最快无疑。
3、用时的原理分析:
(1)clone()方法:是java中创建对象的方法之一(另一方法为使用new操作符)。clone()方法执行过程:第一步,分配内存,大小和源对象相同。第二步,使用源对象中的各个域,填充新对象的各个域,填充完成,clone() 方法返回。
(2)copyOf()方法源码:
第二步,调用System.arraycopy()方法,为声明数组赋值,这是一个有native关键字的方法,故调用的是C++编写的底层函数,可见其为JDK里面的底层函数,这对其提升运行速率会有明显影响。
第三步,返回声明数组。
注意:此处返回类型为int[],因为我的测试用例是int[]类型数组,copyOf()方法源码的返回类型还有很多基本类型。
(3)System.arraycopy()源码如下:
(4)for()循环,因为编译时会产生太多无用字节码,速度慢一些。
4、测试代码:
1、4种方式都包括什么?
(1)利用clone()方法进行复制
(2)利用copyOf(int[] original, int newLength)方法进行复制
(3)利用arraycopy(Object src, int srcPos,Object dest, int destPos,int length)方法进行复制
(4)利用for循环进行复制.
2、用时比较:(3)<(2)<(1),(4)通常是在(1)后面的,但是有的测试用例(4)在(2)和(1)之间,但(3)肯定是最快无疑。
3、用时的原理分析:
(1)clone()方法:是java中创建对象的方法之一(另一方法为使用new操作符)。clone()方法执行过程:第一步,分配内存,大小和源对象相同。第二步,使用源对象中的各个域,填充新对象的各个域,填充完成,clone() 方法返回。
(2)copyOf()方法源码:
public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }第一步,声明一个返回类型的数组对象。
第二步,调用System.arraycopy()方法,为声明数组赋值,这是一个有native关键字的方法,故调用的是C++编写的底层函数,可见其为JDK里面的底层函数,这对其提升运行速率会有明显影响。
第三步,返回声明数组。
注意:此处返回类型为int[],因为我的测试用例是int[]类型数组,copyOf()方法源码的返回类型还有很多基本类型。
(3)System.arraycopy()源码如下:
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);关于这个方法的介绍(2)中已经写过。所以(3)的效率肯定比(2)快。
(4)for()循环,因为编译时会产生太多无用字节码,速度慢一些。
4、测试代码:
import java.util.Arrays; /** * Created by cxh on 17/07/21. */ public class Main { public static void main(String[] args) { int[] a=new int[1000000]; for(int i=0;i<1000000;i++) { a[i] = i; } //数组赋值的4种方式,每次调用其中一个方法 //调用方法1,用时:754ms getB1(a); //调用方法2,用时:724ms getB2(a); //调用方法3,用时:655ms getB3(a); //调用方法4,用时:730ms getB4(a); } //1,利用clone()方法进行复制 private static void getB1(int[] original){ int[] b1=original.clone(); //输出b1 for(int i=0;i<1000000;i++){ System.out.print(b1[i]+","); } } //2,利用copyOf(int[] original, int newLength)方法进行复制 private static void getB2(int[] orginal){ int[] b2=Arrays.copyOf(orginal,1000000); //输出b2 for(int i=0;i<1000000;i++){ System.out.print(b2[i]+","); } } //3,利用arraycopy(Object src, int srcPos,Object dest, int destPos,int length)方法进行复制 private static void getB3(int[] orginal){ int[] b3=new int[1000000]; System.arraycopy(orginal,0,b3,0,1000000); //输出b3 for(int i=0;i<1000000;i++){ System.out.print(b3[i]+","); } } //4,利用for循环进行复制. private static void getB4(int[] original){ int[] b4=new int[1000000]; for(int i=0;i<1000000;i++){ b4[i]=i; } //输出b4 for(int i=0;i<1000000;i++){ System.out.print(b4[i]+","); } } }
相关文章推荐
- java数组复制的4种方式
- java数组复制的4种方式,java数组拷贝问题
- Java 4种数组复制方式的性能比较
- java复制文件的4种方式
- java复制文件的4种方式
- java复制文件的4种方式
- [java]数组复制的2种方式
- java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归
- java复制文件的4种方式
- java字节流的方式复制一个文件,按数组读取和写入
- java复制文件的4种方式
- java数组复制的方式和效率比较
- Java中数组复制的4种方法
- 【Java源码分析】Java复制数组的方法
- 【java】数组复制几种方式比较
- java数组复制的方式和效率比较
- 4种java复制文件的方式
- java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归
- java复制文件的4种方式
- java中复制数组的几种方式