(java 必備知識之一) java 數組複製 System方法 arrayCopy 深入解析

無論是從事java的,或是java愛好者,必需要了解的System.arrayCopy ,瞭解它就等於瞭解了ArrayList 與 Vector 的特性. (java 必備知識)

 

ArrayList 的實現代碼:

 

 其實ArrayList 就是一個數組的形式存放數據的. 沒有高深的地方.他的性能在於他的索引能力,正因爲他是數組形式,所以索引元素的時候他表現得非常的快速成,試想一下,只要知道這個元素的索引,E[2] 你看對像就出來了.這就是ArrayList 最突出的地方.讓我們來看下ArrayList 內部數組是如何自我Copy的.要想深入的瞭解他就必需要看他的API,add 方法與 remove 方式. 看完後你就會對它有一個深刻的理解了.如下原碼:

 

Add 方法

 

 

 

remove 方法

 

上述兩個方法足以讓你認識他們了.他的主要執行過程就在於數組對像的自我複製.System.arrayCopy. 這個方法是

System類中的一個JNI方式實現類.(JNI , Java Native Interface 故名思意,就是java 語言調其它語言的一個接口)

 

這個JNI的底層在不同的平臺上不一樣.打個比方windows 其實java的JNI就是調了dll . Unix 其實就是調了.so 共享庫.

做過C++的一定明白.這個暫且放一下,讓我們來關注一下arrayCopy 如何複製數組元素的. 如果有人對java 的JNI接口

 

有興趣朋友,不防去Sun網站下它的源碼.嘎嘎. C代碼還是有點深度的.SCSL 源碼就能看到. 地址,

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter

(說明:要註冊一個SUN的賬號.纔可以下載.)

 

在JAVA裏面,可以用複製語句"A=B"給基本類型的數據傳遞值,但是如果A,B是兩個同類型的數組,複製就相當於將一個數組變量的引用傳遞給另一個數組;如果一個數組發生改變,那麼引用同一數組的變量也要發生改變.

以下是歸納的JAVA中複製數組的方法:

1.使用FOR循環,將數組的每個元素複製或者複製指定元素,不過效率差一點
2.使用clone方法,得到數組的值,而不是引用,不能複製指定元素,靈活性差一點
3.使用System.arraycopy(src, srcPos, dest, destPos, length)方法,推薦使用

舉例:
1.使用FOR循環
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
for(int i=0;i dest = src;
}

2.使用clone
int[] src={1,3,5,6,7,8};

int[] dest;

dest=(int[]) src.clone();//使用clone創建
副本,注意clone要使用強制轉換

 

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

System.arraycopy(src, 0, dest, 0, 6);

-------------------------------------------------------------------
System提供了一個靜態方法arraycopy(),我們可以使用它來實現數組之間的複製.
其函數原型是:public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
src:源數組; srcPos:源數組要複製的起始位置;
dest:目的數組; destPos:目的數組放置的起始位置; 
length:複製的長度.
注意:src and dest都必須是同類型或者可以進行轉換類型的數組.
有趣的是這個函數可以實現自己到自己複製,
比如:int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);
則結果爲:{0,1,2,0,1,2,6};實現過程是這樣的,先生成一個長度爲length的臨時數組,將fun數組中srcPos 到srcPos+length-1之間的數據拷貝到臨時數組中,再執行System.arraycopy(臨時數組,0,fun,3,3).

 

上述談到了一個clone ,這也是java備必知識之一.下一回我們來聊聊clone 是如何實現的.他的方式有哪些.續..

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章