常在知乎牛客網關注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咱們能夠查看