Java中Array Arrays ArrayList的區別__Java

來源:互聯網
上載者:User

有時候總被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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.