• java中复制数组的5种方法


    1. “=”,相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变.,这一种勉强算是吧
    2. 使用FOR循环,将数组的每个元素复制或者复制指定元素,不过效率差一点
    3. 使用clone方法,得到数组的值,而不是引用,不能复制指定元素,灵活性差一点
    4. 使用System.arraycopy(src, srcPos, dest, destPos, length)方法,推荐使用,效率最高


    public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);
    src:源数组; srcPos:源数组要复制的起始位置;
    dest:目的数组; destPos:目的数组放置的起始位置;
    length:复制的长度.

    因为根据System.arraycopy()源码,可以看到是native方法:native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。 可以将native方法比作Java程序同C程序的接口。

    5 . copyOf(),,不是System的方法,而是Arrays的方法,下面是源码,可以看到本质上是调用的arraycopy方法。,那么其效率必然是比不上 arraycopy的.

    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;
    }

    使用方法:
    1.使用clone
    int[] src={1,3,5,6,7,8};
    int[] dest;
    dest=(int[]) src.clone();//使用clone创建副本,注意clone要使用强制转换

    2、使用System.arraycopy
    int[] src={1,3,5,6,7,8};
    int[] dest = new int[6];
    System.arraycopy(src, 0, dest, 0, 6);

    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,怪不得。

    附测试代码:

    Java代码  收藏代码
      1. package copytest;  
      2.   
      3. public class ArrayCopyTest  
      4. {  
      5.     private static String [] src   
      6.     = {"Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      7.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      8.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      9.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      10.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      11.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      12.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      13.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      14.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",  
      15.         "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff"};  
      16.       
      17.     private static String [] dst;  
      18.   
      19.     /** 
      20.      * @param args 
      21.      */  
      22.     public static void main(String[] args)  
      23.     {  
      24.         // TODO Auto-generated method stub  
      25.         System.out.println(forCopy(5000000));  
      26.         System.out.println(cloneCopy(5000000));  
      27.         System.out.println(systemJNICopy(5000000));  
      28.     }  
      29.       
      30.     /** 
      31.      * 使用for来复制数组 
      32.      * @param time 循环执行的次数 
      33.      * @return 执行的总时间 
      34.      */  
      35.     public static long forCopy(int time)  
      36.     {  
      37.         long start = System.currentTimeMillis();  
      38.         while(time-- > 0)  
      39.         {  
      40.             int size = src.length;  
      41.             dst = new String [size];  
      42.             for (int i = 0; i < size; i++)  
      43.             {  
      44.                 dst[i] = src[i];  
      45.             }  
      46.         }  
      47.         long end = System.currentTimeMillis();  
      48.         return (end - start);  
      49.     }  
      50.       
      51.     public static long cloneCopy(int time)  
      52.     {  
      53.         long start = System.currentTimeMillis();  
      54.         while(time-- > 0)  
      55.         {  
      56.             dst = (String[])src.clone();  
      57.         }  
      58.         long end = System.currentTimeMillis();  
      59.         return (end - start);  
      60.     }  
      61.       
      62.     public static long systemJNICopy(int time)  
      63.     {  
      64.         long start = System.currentTimeMillis();  
      65.         while(time-- > 0)  
      66.         {  
      67.             int size = src.length;  
      68.             System.arraycopy(src, 0, dst, 0, size);  
      69.         }  
      70.         long end = System.currentTimeMillis();  
      71.         return (end - start);  
      72.     }  
      73.   

       最终结果是:System.arraycopy>clone>Arrays.copyOf>for

       这里面在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。而Arrays.copyOf(注意是Arrays类,不是Array)的实现,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。

  • 相关阅读:
    http/ip 协议
    shell脚本
    LoadRunner脚本编写
    【WebGL】《WebGL编程指南》读书笔记——第6章
    【WebGL】《WebGL编程指南》读书笔记——第5章
    【WebGL】《WebGL编程指南》读书笔记——第4章
    【WebGL】《WebGL编程指南》读书笔记——第3章
    【WebGL】《WebGL编程指南》读书笔记——第2章
    【移动支付】.NET微信扫码支付接入(模式二-NATIVE)
    【学车】学车笔记-科目二
  • 原文地址:https://www.cnblogs.com/xuxinstyle/p/9559331.html
Copyright © 2020-2023  润新知