zoukankan      html  css  js  c++  java
  • 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的,多了一个步骤,肯定就不是最快的。

  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/xuxinstyle/p/9559331.html
Copyright © 2011-2022 走看看