先看ArrayList源碼中數組複製的代碼:
其實ArrayList 就是一個數組的形式存放數據的. 沒有高深的地方.他的性能在於他的索引能力, 正由於他是數組形式,因此索引元素的時候他表現得很是的快速成,因此查找的時候是很是快的,可是插入或者刪除一條記錄就比較慢了,試想一下, 只要知道這個元素的索引,E[2] 你看對像就出來了.這就是ArrayList 最突出的地方.
讓咱們來看下ArrayList 內部數組是如何自我Copy的.要想深刻的瞭解他就必須要看他的API,add 方法與remove 方式.
看完後你就會對它有一個深入的理解了.以下原碼:
Add 方法
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
remove 方法
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
上述兩個方法足以讓你認識他們了.他的主要執行過程就在於數組對像的自我複製.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/INTER ... VariationTypeFilter
(說明:要註冊一個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<6;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};