Java基礎——List集合整理(腦圖,源碼,面試題)

常在知乎牛客網關注Java的一些面試,瞭解過校招社招常面哪些內容。Java集合不只使用頻率高並且在初面中也經常被問到,何止是經常,關於ArrayList的擴容,HashMap的一些底層等等都被問到爛了。所以,稍微深刻學習下集合這部分迫在眉睫。如下爲本身的一些知識點總結與網上搜刮來的面試題總結。html

1.集合的引入 面試

數組大小固定且只可以存儲同一種類型的元素,集合容量可動態改變。api

數組能存儲基本數據類型和引用類型,集合只能存儲引用類型(你存儲的是int,會自動裝箱成Integer)數組

2.掌握集合的體系結構 安全

引用自CSDN:https://blog.csdn.net/haovip123/article/details/45423683源碼分析

3.掌握以ArrayList爲表明的增刪改查和一些其餘API的使用 post

ArrayList能夠說是使用頻率很高的集合,掌握以它爲表明的經常使用API的使用,如add,addAll,remove,遍歷等。 性能

4.源碼分析List集合之ArrayList與Vector的剖析學習

具體的細節不予多講,前輩們都在源碼的基礎上剖析總結的很是細緻,在他們的基礎上學習便可。附鏈接spa

https://blog.csdn.net/panweiwei1994/article/details/76760238

https://blog.csdn.net/panweiwei1994/article/details/77110354

https://blog.csdn.net/zymx14/article/details/78324464

http://www.javashuo.com/article/p-csdeqcso-dm.html

重點小結:

ArrayList集合與Vector集合的區別?

ArrayList與Vecto都實現了List接口,具備元素有序容許重複和爲null的特色。底層都採用數組,具備數組增刪慢,查詢快的特色。主要區別是Vector集合(只作了簡單瞭解)給全部的api都套上了synchronized修飾,因此Vector集合是同步的,在線程上安全的,但有得必有失,失去的是代碼在實現同步時間花銷大(有些操做你不須要進行同步操做它也給你進行了這是它最大的缺點)。其次在實現動態擴容時,ArrayList是原來的1.5倍而Vector是原來的2倍。

關於ArrayList的擴容是如何實現的原理是什麼?

首先明確ArrayList的構造方法有三種,默認的initCapacity容量爲10,若是初始化時一開始指定了容量,或者經過集合做爲元素,則容量爲指定的大小或參數集合的大小。每次擴容爲原來的1.5倍,若是擴容後的容量小於所需的最小容量,則數組容量爲所需的最小容量。若是擴容後的容量大於所需的最小容量,則數組容量爲擴容後的容量。 每次擴容後都要調用arraycopy    ,涉及到整個數組的複製和移動。因此要儘可能減小擴容的次數提升效率,在數據量比較大的時候初始化時指定容量的大小。

LinkedList的底層與經常使用方法實現的瞭解

LinkedList也實現了List接口,有序且容許元素重複和爲null值,底層是雙向鏈表,具備鏈表增刪效率高和查詢效率慢的特色。雖然它在查詢實現時採用了折半查找提升效率的思想,但在查詢上仍是比不過按索引查的ArrayList.作過單鏈表,雙向鏈表練習的人應該再看LinkedList源代碼感到很熟悉。

5.List集合面試題總結:

結合源代碼與上面貼的博客連接認真看完,在回答下面的List集合的面試題就比較自信了。以前有整理過,此次在整理過一遍,答案見:

http://www.javashuo.com/article/p-vevncfnn-bn.html

1.請比較ArrayList集合與Vector的區別?

2.往ArrayList集合加入一萬條數據,應該怎麼提升效率?

3. ArrayList插入刪除必定很慢嗎?

4.ArrayList的遍歷和LinkedList遍歷性能比較如何?

5. ArrayList是如何擴容的\ArrayList是如何實現自動增長的?

6. 什麼狀況下你會使用ArrayList?何時你會選擇LinkedList?

7. 如何複製某個ArrayList到另外一個ArrayList中去?

8. 在索引中ArrayList的增長或者刪除某個對象的運行過程?效率很低嗎?解釋一下爲何?

9. ArrayList list = new ArrayList(20);中的list擴充_____次。

10.下列代碼判讀擴容了幾回?

每一次的add都要檢查容量是否足夠,這裏使用for循環一個個增長元素,因此擴容過程爲20->30->45->67,3次。

11.有以下代碼,判斷list最後容量的大小。    

可知list初始化爲5個容量,以後一次性增長15個容量,第一次擴容爲10,以後發現15>10,因此15爲數組的新容量。調用debug咱們能夠查看

相關文章
相關標籤/搜索