有時候總被java語言中的Array, Arrays和ArrayList弄的雲裡霧裡的, 它們之間究竟有什麼聯絡呢。查看了相關的原始碼,終於找到了一些端倪。做個筆記,方便查看。
1. Array
Array和[]的關係就如int 和Integer, boolean 和Boolean. 它的建構函式是私人的,賦值提供靜態諸如 setInt(Object arr, int index, int i) setFloat(Object arr, int index, float f) set(Object arr, int index, Object value)之類的方法, 取值提供靜態 getInt(Object arr, int index) get(Object arr, int index) 之類 的方法. 在JDK1.6的源碼中, 這些方法都是由本地代碼實現。由於沒有找到本地代碼,不能深入的學習, 查看android4.2的源碼,這些方法並沒有用本地代碼實現,直接根據實際的類型,分配數組。
2. Arrays
Arrays主要提供toString(), 排序, 二分尋找, copyOf()等方法. 同樣構造方法是私人的, toString() 排序 尋找和 copyOf()等方法也是靜態,其中對於亂序的基本類型資料用到的是雙樞紐快速排序演算法(DualPivotQuicksort),對於亂序的Object[] 用的是歸併排序(不過,注釋中指出歸併排序是曆史遺留問題,將來的發行版會刪去。下一篇,我想對常用的排序演算法做個筆記)。copyOf()會分配臨時數組,最終會調用System.arraycopy()來完成數組元素的拷貝。
3. ArrayList
ArrayList這個平時用的比較多,感覺比較熟悉, 本著好奇的心,看了一下實現。ArrayList的內部是用 Object[]來儲存的, 開始預設為10個, 調用add等方法時,會檢查數組是否裝滿, 若裝滿, 則按照數組當前長度的一半增長,調用Arrays.copyOf()拷貝數組中的元素。調用remove()方法時, 最終也會調用System.arrayCopy()來移動數組中的元素。
ArrayList的添加和刪除方法都最終直接或者間接的調用System.arraycopy()方法。那arraycopy()到底張的啥樣呢。 在System.java檔案中,看到了arraycopy()方法的原型, 又是一個native方法。搜遍了JDK源碼和Android4.2源碼中的本地代碼,都沒有發現它的實現。(納悶了,這些本地方法到底在哪裡實現的呢。虛擬機器的動態庫中?)
嘗試從jre目錄的所有.so檔案中找到arraycopy()的影子。從libjvm.so檔案的匯出符號中終於找到了arraycopy的蹤跡。 果然在libjvm.so檔案中。在libjava.so檔案的匯出符號中, 同樣也找到了getInt(), getBoolean()等。
註:
參考的jdk源碼版本是jdk1.7.0_25, android'的源碼是4.2.