java中数组复制的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]+",");
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值