Java原來還可以這麼學:如何搞定面試中必考的集合類
原創宣告
本文首發於微信公眾號【程式設計師黃小斜】
本文作者:黃小斜
轉載請務必在文章開頭註明出處和作者。
系列文章介紹
本文是《五分鐘學Java》系列文章的一篇
本系列文章主要圍繞Java程式設計師必須掌握的核心技能,結合我個人三年多的Java學習和工作經歷,總結和沉澱下來的方法論,希望能讓Java學習這件事變得更簡單,作者目前在阿里做Java,忙裡偷閒分享一些技術文章,有興趣看本系列更多文章可以關注我的公眾號【Java技術江湖】
系列文章將會把一些技術學習方法、過程、要領與我的學習經驗相結合,更加淺顯易懂,並且我也會把我學習時用的資料,書籍和文章拿出來分享給大家,節省你我的時間。所謂授人以魚也要授人以漁,是本系列文章希望達到的目標。
簡介
最近的你有沒有參加Java面試呢?你有沒有發現,Java面試中總是愛考一類問題,那就是集合類,為什麼對集合類的考察會如此受歡迎呢,其實啊,主要是因為集合類的使用範圍實在是太廣了,不管是開發中,還是框架原始碼中,往往都會用到集合類。
像我們們平時面試經常遇到的問題,比如hashmap、linkedlist,或者是阻塞佇列等集合類,往往都是我們們工作中需要用到的一些工具。
根據百度百科的定義,集合類是Java資料結構的實現。Java的集合類是java.util包中的重要內容,它允許以各種方式將元素分組,並定義了各種使這些元素更容易操作的方法。Java集合類是Java將一些基本的和使用頻率極高的基礎類進行封裝和增強後再以一個類的形式提供。集合類是可以往裡面儲存多個物件的類,存放的是物件,不同的集合類有不同的功能和特點,適合不同的場合,用以解決一些實際問題。
可以看出,集合類就是util包裡的一類工具,用好集合類,能幫忙我們解決很多工作中的問題,而學好集合類,才能讓我們在面試中無往而不利。
為什麼面試總愛問Java集合類
有Java面試經歷的朋友們都知道,Java面試最喜歡問的集合類問題就是:hashmap和hashtable的區別,linkedlist和arraylist的區別是什麼,稍微複雜一點的話,則可能會問:hashmap的初始容量是多少,它的擴容方式是什麼樣的,它的內部結構是什麼樣的。
諸如此類問題,深受廣大網際網路公司歡迎,當然,這些都是Java初級面試的問題,算是基礎中的基礎了。
為什麼面試官總是喜歡問集合類呢,依我看來,有這麼幾個原因:集合類裡是Java裡使用範圍最廣,使用頻率最高的api了,並且這玩意的通用性很強,很多框架都得使用,如果想要看懂框架原始碼,那麼你就必須要掌握集合類的知識。
其次,集合類裡蘊藏了很多資料結構與演算法的知識,正因為如此,如果你能正確地理解這些集合類,那麼想必你對於資料結構和演算法的理解也差不到哪。
還有就是,Java集合類裡的很多原始碼都是幾個Java創始人大牛寫的,程式碼質量和風格都非常值得我們學習,裡面用到的一些演算法和解決問題的方法也非常值得效仿,而這些,都必須要透過學習集合類的原始碼只是才能夠做到。
如何學習Java集合類
第一次接觸
第一次接觸集合類,想必大家的方式都差不多,應該就是用了一個叫做List的東西,以及它的子類ArrayList,透過它的api我基本上就可以瞭解它有哪些功能了,無非就是增刪改查唄。
雖然這東西看起來沒有什麼難度,但是面試題裡可不會直接問你它的api有哪些,恰好一次面試,面試官就問了我ArrayList相關的問題:ArrayList的底層資料結構是什麼,它和linkedlist的區別是什麼,它的擴容方式是怎麼樣的,它是執行緒安全的麼,這些看起來很簡單的問題,我當時一個都回答不上來。
在沒有面試以前,你永遠不知道自己學的其實非常少。
在第一次面試受到打擊之後,我便決定開始面向面試複習,把這類問題統統找出來搞懂。
面向面試複習
既然我們的目標是面試,那麼就必須要搞懂面試題都喜歡考哪些集合類的問題。
於是,上網找面試題就成為一件重要的工作,我花了好幾天的時間到網上搜颳了各類Java面試題,不管是BAT的面經,還是網上整理比較詳細的300道面試題,我都找來看了,雖然有很多重複的題目,但是大部分題目都是我沒見過的。
原來Java集合類可以問出這麼多問題來。
就拿ArrayList來說,可以問資料結構,可以問擴容和一些方法的實現,也可以問你它和linkedlist、vector的區別,複雜一點的,甚至會問你執行緒安全的ArrayList是怎麼實現的,刪除它裡面的某個元素應該如何刪除。
看起來簡單問題的背後,其實都有很多坑,我也是看了很多面試題解析之後才慢慢了解到的。
Java集合類裡最常問的一類題目,無疑就是hashmap了,這玩意實在是太熱門了。
hashmap的資料結構是怎麼樣的,1.8和以前有什麼區別麼,put方法和get又是怎麼實現的,擴容是如何進行的,甚至還會問你具體的hash演算法是怎麼實現的。
更復雜的還有呢,併發工具類裡的linkedhashmap和hashmap有何區別,它又是如何實現的呢,這就牽扯到很多併發程式設計的相關知識了,這部分我們留著下次講併發程式設計的內容時再來一起探討。
看過足夠多的集合類面試題,參加了足夠多的面試之後,我似乎對這些面試題已經無感了,畢竟熟讀唐詩三百首,不會做詩也會吟啊,就這麼幾種題型,每天回答個三五遍,幾個月裡都忘不掉了。
但是,事情並沒有我想象的這麼簡單。雖然這些面試題多看幾遍確實容易記住,但是記憶不能當飯吃,面試時萬一想不出來那可是硬傷,更重要的是,很多時候,面試官問問題都不會按常理出牌,這些網上能找到的面試題,他們一樣可以用別的方式不停地深挖,直到他了解到你的水平為止。
如果你只會簡單地告訴面試官那些死記硬背的答案,而在他深挖集合類實現細節的時候沒能答好的話,也是很扣分的,特別是對於美團、阿里這種Java大廠來說,他們摳細節的能力絕對超出你的想象。
搞懂原理最重要
既然面向面試題複習的方式不一定總是奏效,那麼有沒有更加好的選擇呢。
還真有,那就是,理解技術的實現原理。面試題是個好東西,但是我們不能只停留在簡單的一問一答上,並不是說你搞懂了這個面試題的答案是什麼就行了。 舉個例子,比如說,Java中的hashmap的資料結構是什麼樣的,它的擴容方式又是如何的,這種時候,如果光是依靠面試題的答案去理解,多少會有一些片面。 你可能可以大概答出個三四點,但是其實你可能也沒真正理解為什麼要這樣做,或者實現細節是怎麼樣的。
實際上,要想真正瞭解hashmap的資料結構和實現原理,最好的辦法就是去看原始碼,有的小夥伴肯定會眉頭一皺,原始碼這麼複雜,看不懂怎麼辦,沒關係,自己看不懂,還可以讓別人教你呀,網上有很多原始碼解析的部落格,我自己也整理了不少,發在我們們的技術部落格how2playlife.com上。
為什麼要看原始碼呢,比如hashmap,它的類定義裡就已經展示了它的資料結構,我們可以從中看出它是一個陣列加連結串列的資料結構,這些成員變數都是在hashmap這個類裡定義好的,並且,再看看它的put和get方法,你就可以知道它是如何插入和查詢資料的,並且,在1.7和1.8原始碼比較的過程中,你也可以更好地理解這兩個版本原始碼的區別。
而對於擴容方法也是一樣的,在hashmap的擴容方法中,你可以看到的是,hashmap為了把原來的資料搬到擴容後的資料結構中,就必須要進行重新雜湊,調整每個元素的索引和位置,這裡面涉及了一系列演算法,不看原始碼的話,你根本不知道擴容過程中到底發生了什麼。
當你看完原始碼,不管你遇到的是原來那些面試題,還是有一些新的面試題,你總會發現其實都差不多,萬變不離其宗,只要你理解了底層的實現之後,對於這些面試題應該都能夠比較好地應付。
有些事,你必須要經歷過,才能明白,有些坑,你不用自己去踩,因為我已經踩過了
推薦資源
書籍
實際上市面上並沒有針對Java集合類專門出的書籍,畢竟集合類只是JDK裡的一小部分。
在之前那篇關於學習Java基礎的文章裡,我推薦給了大家一些書籍,裡面也講了很多關於集合類的東西。
《Java核心技術卷一》 《Java程式設計思想》
部落格
Java技術倉庫《Java程式設計師複習指南》
整合全網優質Java學習內容,幫助你從基礎到進階系統化複習Java。
我的個人部落格:
社群: CDSN我就不推薦了,反正百度你們搜一下也都是CSDN的結果
這裡重點推薦兩個社群,實打實的有很多幹貨,對文章要求比較高,我的很多文章質量都達不到他們的要求。
1、掘金
2、開發者頭條
總結
關於如何學習Java集合類,並且搞定相關面試題,我們今天就講到這裡了,如果還有什麼疑問也可以到我公眾號裡找我探討,後續會有更多的文章推出,包括如何系統性地學習JavaWeb,如何系統性地學習Java核心技術和底層原理,以及如何系統性地學習後端技術。敬請期待。
對了,你想問我文章裡提到的書籍和影片去哪找?我已經給你準備好了
文中提到的資源都可以免費領取,在我的公眾號【程式設計師黃小斜】回覆“Java基礎”即可免費領取對應的資源。
寫在最後
如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉發朋友圈就是對我最大的支援啦,你們的支援是對我最大的鼓勵。
對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。另外本系列文章也會製作成相應的影片放到B站,趕緊來B站關注我吧。
微信公眾號:程式設計師黃小斜 知乎:黃小斜 B站:黃小斜
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2679935/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 新手如何入門linux,linux原來還可以這麼學Linux
- ca..原來 stf 還可以這麼玩...
- 五分鐘學Java:如何學習Java面試必考的JVM虛擬機器Java面試JVM虛擬機
- 五分鐘學Java:如何學習Java面試必考的網路程式設計Java面試程式設計
- java列舉原來還能這麼用Java
- BAT面試必備——Java 集合類BAT面試Java
- Java面試中,遇到這類面試題最吃虧!Java面試題
- 用 Java 訓練深度學習模型,原來可以這麼簡單!Java深度學習模型
- 原來還可以這麼切換到正常編輯器的模式模式
- 100家IT 名企面試必考面試題java系列面試題Java
- 這幾道Java集合框架面試題在面試中幾乎必問Java框架面試題
- 原來我也可以這麼優秀(一)一個簡單的極限測試(還在修訂中)
- 2018最新《BAT Java必考面試題集》BATJava面試題
- 實戰技巧,Vue原來還可以這樣寫Vue
- 原來vue的slot可以這麼玩轉Vue
- 搞定字串類面試題-Palindrome字串面試題
- 大型網際網路公司必考java面試題與面試技巧Java面試題
- Java面試題:Java中的集合及其繼承關係Java面試題繼承
- 面試必考:秒殺系統如何設計?面試
- 原來word中還有這些小技巧!
- Java集合類常見面試知識點總結Java面試
- js面試必考三問JS面試
- Java Collection集合面試題Java面試題
- 原來git還可以起死回生!Git
- 分散式事務,原來可以這麼玩?分散式
- 原來Java的發家史是這麼回事Java
- 原來 Element 的元件原始碼還能這麼看元件原始碼
- 原來Spring能注入集合和Map的computeIfAbsent是這麼好用!Spring
- 是面試官放水,還是公司實在是太缺人?這都沒掛,華為原來這麼容易進...面試
- 面試必考:網路問題面試
- 面試中Java泛型問題一文搞定面試Java泛型
- Dapper原來還可以直接這樣寫SQL,很強大哦APPSQL
- Java集合框架中的介面和類Java框架
- 提高職場效率,原來可以這麼簡單
- 【JAVA】【面試】【基礎篇】- 集合Java面試
- Java集合高頻面試題Java面試題
- OKR這麼好用,竟然還可以用它來擇偶?!OKR
- 看完這篇,Promise面試就搞定了...Promise面試