我們先來介紹下Arraylist的知識:
(學習影片分享:java教學影片)
Arraylist:底層是基於動態數組,根據下表隨機存取數組元素的效率高,向數組尾部添加元素的效率高;
但是,刪除數組中的資料以及向數組中間添加資料效率低,因為需要移動數組。例如最壞的情況是刪除第一個數組元素,則需要將第2至第n個數組元素各向前移動一位。而之所以稱為動態數組,是因為Arraylist在數組元素超過其容量大,Arraylist可以進行擴容(針對JDK1.8 數組擴容後的容量是擴容前的1.5倍),Arraylist源碼中最大的數組容量是Integer .MAX_VALUE-8,對於空出的8位,目前解釋是:
①儲存Headerwords;
②避免一些機器記憶體溢出,減少出錯幾率,所以少分配;
③最大還是能支援到Integer.MAX_VALUE(當Integer.MAX_VALUE-8依舊無法滿足需求時)。
以下是Arraylist部分原始碼:Arraylist擴容:
(更多面試題分享:java面試題目及答案)
Arraylist新增資料:(向陣列尾部新增)
# 新增陣列給陣列的指定位置:
######################################################### ###可以看到,只要ArrayList的當前容足夠大,add()操作向數組的尾部的效率非常高的,當向數組指定位置添加資料時,會進行大量的數組移動複製操作。而陣列複製時,最終會呼叫System.arraycopy()方法,因此add()操作的效率還是相當高的。儘管這樣當新增資料至指定位置時還是比Linkedlist慢,後者新增資料只需要改變指標指向即可。 Arraylist刪除數組也需要移動數組,效率較慢。 ######Linkedlist基於鍊錶的動態數組,資料添加刪除效率高,只需要改變指標指向即可,但是存取資料的平均效率低,需要對鍊錶進行遍歷。 Arraylist get資料的原始碼:(根據下標訪問,效率高)###############Linkedlist存取資料的原始碼:(node()函數遍歷鍊錶)###### ##################總結:######1、對於隨機存取get和set,ArrayList優於LinkedList,因為LinkedList要移動指標。 ######對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。 ###### 2、各自效率問題:################相關建議:###java入門教學###############java入門教學課程######以上是java面試之Arraylist和Linkedlist的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!