1. 程式人生 > >關於java陣列拷貝的效能

關於java陣列拷貝的效能

java 提供的System.arrayCopy()方法比自己寫的陣列copy要快.

檢視其原始碼:

  1. publicstaticnativevoid arraycopy(Object src,  int  srcPos,
  2.                                         Object dest, int destPos,
  3. int length);

可以看到被定義為native方法...速度比自己寫的普通方法要快.

在jdk1.6中加入了新的陣列拷貝方法.Arrays.copyOfRange().

其原始碼:

  1. publicstaticbyte[] copyOfRange(
    byte[] original, int from, int to) {
  2. int newLength = to - from;
  3. if (newLength < 0)
  4. thrownew IllegalArgumentException(from + " > " + to);
  5. byte[] copy = newbyte[newLength];
  6.         System.arraycopy(original, from, copy, 0,
  7.                          Math.min(original.length - from, newLength));
  8. return
     copy;
  9.     }

其實就是System.arraycopy..暈死.

別為做的測試:

  1. /*******************************************************************************
  2.  *
  3.  * 比較賦值與System.arraycopy誰快
  4.  *
  5.  * 複製的內容越多,System.arraycopy優勢更明顯
  6.  *
  7.  * Author: NeedJava
  8.  *
  9.  * Modified: 2007.09.16
  10.  *
  11.  ******************************************************************************/
  12. publicfinalclass WhoFaster
  13. {
  14. publicstaticvoid main( String[] args )
  15.   {
  16. /*/
  17.     int begin=100; 
  18.     int length=12; 
  19.     String temp="12345678901234567890"
  20.                +"12345678901234567890"
  21.                +"12345678901234567890"
  22.                +"12345678901234567890"
  23.                +"12345678901234567890"
  24.                +"黑客帝國忍者神龜變形金剛"
  25.                +"12345678901234567890"
  26.                +"12345678901234567890"
  27.                +"12345678901234567890"
  28.                +"12345678901234567890"
  29.                +"12345678901234567890"; 
  30.     int times=10000000;  //千萬
  31.     /*/
  32. int begin=100
  33. int length=120
  34.     String temp="12345678901234567890"
  35.                +"12345678901234567890"
  36.                +"12345678901234567890"
  37.                +"12345678901234567890"
  38.                +"12345678901234567890"
  39.                +"黑客帝國忍者神龜變形金剛"
  40.                +"黑客帝國忍者神龜變形金剛"
  41.                +"黑客帝國忍者神龜變形金剛"
  42.                +"黑客帝國忍者神龜變形金剛"
  43.                +"黑客帝國忍者神龜變形金剛"
  44.                +"黑客帝國忍者神龜變形金剛"
  45.                +"黑客帝國忍者神龜變形金剛"
  46.                +"黑客帝國忍者神龜變形金剛"
  47.                +"黑客帝國忍者神龜變形金剛"
  48.                +"黑客帝國忍者神龜變形金剛"
  49.                +"12345678901234567890"
  50.                +"12345678901234567890"
  51.                +"12345678901234567890"
  52.                +"12345678901234567890"
  53.                +"12345678901234567890"
  54. int times=1000000;  //百萬
  55. //*/ 
  56. char[] oldArray=temp.toCharArray(); 
  57. char[] newArray=null
  58. long start=0L; 
  59. ////////////////////////////////////////////////////////////////////////////
  60. //
  61. // 單純賦值
  62. //
  63. ////////////////////////////////////////////////////////////////////////////
  64.     newArray=newchar[length]; 
  65.     start=System.currentTimeMillis(); 
  66. forint i=0; i<times; i++ )
  67.        {
  68. forint j=0; j<length; j++ )
  69.             {
  70.               newArray[j]=oldArray[begin+j];
  71.             }
  72.        } 
  73.     System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) ); 
  74. ////////////////////////////////////////////////////////////////////////////
  75. //
  76. // System.arraycopy
  77. //
  78. ////////////////////////////////////////////////////////////////////////////
  79.     newArray=newchar[length]; 
  80.     start=System.currentTimeMillis(); 
  81. forint i=0; i<times; i++ )
  82.        {
  83.          System.arraycopy( oldArray, begin, newArray, 0, length );
  84.        } 
  85.     System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
  86.   }

其結論:

在第一種情況,迴圈千萬,一個900,一個1000,兩者相差100毫秒

第二種情況就拉大了,迴圈千萬,一個6700,一個2200,相差4500毫秒

為防止JVM將字元陣列作為常量儲存在記憶體中,我分別遮蔽執行,效果一樣。

也就是說,對於很短的字串複製,單純賦值略快,可以忽略

對於很長的字串複製,用單純賦值就是髒程式碼

相關推薦

關於java陣列拷貝效能

java 提供的System.arrayCopy()方法比自己寫的陣列copy要快. 檢視其原始碼: publicstaticnativevoid arraycopy(Object src,  int  srcPos,                            

JAVA陣列拷貝

陣列的四種拷貝方式 一丶for迴圈拷貝 public class Demo1 { private int val = 10; public void setVal(int val) { this.val = val; } public in

Java陣列拷貝方法arraycopy()

java.lang.System類的arraycopy()方法提供了陣列元素複製功能——將一個數組的連續多個元素的值批量複製到另一個數組中去。 例如://源陣列          int source[] = {1,2,3,4,5};          //目的陣列    

【效率優化專題】2.java陣列拷貝的3種方式和效率對比

Java語言中常用的陣列拷貝方式有:for迴圈拷貝,通過Arrays.copyOf()方法,System.arraycopy和clone()方法拷貝。1 測試場景我們用最簡單的整數陣列來測試。首先建立一個整型陣列,並且初始化資料。然後分別用這3種方式來拷貝陣列同樣的次數。來測分別試這三種情況的效率。1.1 初

Java陣列/集合效能優化

1、 複製陣列元素,使用System類arraycopy()方法替代迴圈賦值在陣列之間複製元素 建議:System類arraycopy()方法複製陣列元素 杜絕:迴圈賦值複製陣列元素 原因

Java陣列拷貝/複製的效率比較

今天在研究Jlibrtp程式碼時,偶然注意到裡面大量使用了System.arraycopy()這個方法,心想既然是協議實現,那用的方法肯定都是效率最高或較高的了,以前對這個System.arraycopy()僅有個抽象的認識。另外,JDK中對ArrayList的add與remove方法的實現,居然也是用的S

java陣列拷貝哪個效率高

之前看到很多問題以及很多部落格都有討論java陣列拷貝的效率問題,一般都是討論如下幾種方法 int[] b=a.clone(); System.arraycopy(a, 0, b, 0, n); int[] b=Arrays.copyOf(a, n); int[] b

java陣列的四種拷貝方法的效能分析:for、clone、System.arraycopy、Arrays.copyof

今天作者就Java陣列的拷貝方法進行效能比較,多有不足,請大家指正!!! 1.for方法,用迴圈依次實現陣列元素的拷貝。 2.clone方法,是Object類的方法,用來實現物件的複製操作。 3.System.arraycopyof方法,是System的靜態方法,是一個na

2.Java陣列_一維陣列二維陣列的動態初始化與靜態初始化、方法接收/返回/修改陣列java陣列的排序/全拷貝/部分拷貝

Java陣列----引用資料型別,必須在使用前先初始化;否則會nullPointerException(執行時異常)。 (引用傳遞:多個棧記憶體指向同一塊堆記憶體) 1.一維陣列初始化 (1)動態初始化(宣告並開闢陣列) 資料型別[] 陣列名稱 = new 資料型別[長度]; 如

Java——陣列拷貝

1.for迴圈拷貝: int[] array={1,2,3,4,5}; int[] brray=new int[array.length]; for(int i=0;i<array.length;i++) {

Java.util.Arrays 與 陣列拷貝

Java.util.Arrays  java.util.Arrays類中提供了許多實用的方法,可用於陣列的複製、排序等操作處理。 以下是常用的方法和屬性: Arrays.sort() 序列排序: 原始碼: public static void sort(int[]

java物件拷貝——PropertyUtils copyProperties 用法和效能

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java陣列的四種拷貝方式

拷貝陣列方式 深拷貝/淺拷貝 是否產生新的物件 備註 for迴圈拷貝 淺拷貝 否 拷貝速度最慢 clone拷貝陣列

java 屬於也是可以 arr1= arr2,陣列拷貝 兩個變數將引用同一個陣列

package javacore; /** * @author lixw * @date created in 12:02 2018/12/17 */ public class ArrayTest { public static void main(String[] args

java:IO流(位元組陣列拷貝之available()方法---不推薦使用)

* int read(byte[] b):一次讀取一個位元組陣列 * write(byte[] b):一次寫出一個位元組陣列 * available()獲取讀的檔案所有的位元組個數 import ja

JAVA拷貝陣列

JAVA中拷貝部分陣列 陣列部分拷貝:指將陣列中一部分內容替換掉另一陣列中 的部分內容(必須是連續的)。 在java.lang.System(預設無需說明)中的System.arraycopy(源陣列名稱,源陣列開始點,目標陣列名稱,目標陣列開始點,拷貝長度);

Java陣列拼接字串幾個寫法效能比較

將陣列 int[] arr = {0,1,2,3,4,5,6,7,8,9} 拼接成 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 字串: StringBuilder sb = new StringBuilder(arr.length*3); // Stri

Java 陣列拷貝與深拷貝

http://www.cppblog.com/baby-fly/archive/2010/11/16/133763.html 定義一個數組int[] a={3,1,4,2,5}; int[] b=a;  陣列b只是對陣列a的又一個引用,即淺拷貝。如果改變陣列b中元素的值

Java陣列物件的深拷貝

ArrayList<Cell> cells = ArrayList<Cell>(); ArrayList<Cell> init_cells = new ArrayList<Cell>(); init_cells = (Array

java 陣列拷貝 物件陣列拷貝 System.arraycopy函式

  /*java 陣列的操作   System類的arraycopy靜態函式用於陣列拷貝   陣列是不能越界的 物件陣列的複製實際上是複製的引用的拷貝  也就是物件的地址  */class Point{ int x; int y; Point(int x,int y) {