JAVA隨時筆記(二):Java面試題---基礎之ArrayList相關

1、ArrayList的擴容原理

答:ArrayList的底層是一個數組結構,在jdk8之前,無參構造默認初始化容量爲10,jdk8以後,容量默認爲0,只有在添加第一個元素時,才擴容爲默認的10。Arraylist的擴容是創建一個1.5倍長度的新數組,然後用Arrays.copyOf方法(內部調用的system.copy方法,system.copy是一個native方法,可以快速高效的對數組進行復制)把舊數組的值全部複製到新的數組中。再把內部的數組成員指向新的數組。

2、Arraylist和vector的區別

答:ArrayList是線程不安全的,vector是線程安全的,如果要讓ArrayList線程安全,可以使用Collections.synchronizedList方法把Arraylist包裝成線程安全的集合。vector的無參構造直接默認創建一個長度爲10的數組。Arraylist只有再添加第一個元素才把長度爲0的數組擴容爲10。擴容的時候vector是將容量翻倍,即爲原來的2倍,Arraylist是擴容0.5倍,即原來的1.5倍。因爲vector是線程安全的,使用需要維護集合的同步,效率低於Arraylist。一般都是使用Arraylist,只有在需要考慮線程安全的情況下才使用vector。

3、ArrayList和LinkedList的區別

答:ArrayList是基於數組結構的,而LinkedList是基於鏈表結構實現的雙向鏈表。ArrayList內部是使用的數組。在查詢數組的時候直接根據索引就能找到對應的數組,時間複雜度爲O(1),而LinkedList是鏈表結構,查詢數組的時候是從頭節點(或者尾節點)進行遍歷。時間複雜度爲O(n),使用在查詢和修改比較多的場景下,優先考慮使用ArrayList。在插入元素的時候,ArrayList是把元素插入目標位置,然後把目標位置後面全部的元素都後移一位。刪除的時候同理,時間複雜度爲O(n)。而LinkwdList插入和刪除元素只是把node節點的next和perv指向進行更改就行,時間複雜度爲O(1)。所以在插入和刪除比較多的場景下,優先考慮使用LinkedList。

發佈了43 篇原創文章 · 獲贊 38 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章