由於我是一個無論作什麼事情都喜歡進行總結的一我的。因此對於在上週去淘寶面試的經歷,如今面試回來總結,我想對全部程序員們談談。java
以前我是在一家外企工做的,待遇還算不錯,本身也作了快五年了,由於考慮到家庭的緣由,因此在前面幾周辭職回了杭州。在朋友聽到我辭職回來後,好多關係比較好的同事朋友也向我推薦了好多家企業。如:螞蟻金服;支付寶;蘑菇街;阿里雲;淘寶;挖財等~~~~這幾家公司我都去面試了,狀況還算不錯,基本都能聊的來,不出什麼意外狀況,應該都能過。面了這麼多家大廠,那麼我先來總結一下我在面試淘寶時的經歷。程序員
今天自我感受良好的去該公司面試,接待個人是一位漂亮的小姐姐,把我帶到會議室,而後來了一個沒有我帥的·`哈哈哈「自戀不花錢,要保持住心態」
面試官一進來,我一看,竊喜,沒有我帥,接下來的開場很是直接,直接進入正題:(我通常只總結重要內容,其餘的我就帶過,大家本身想象)web
1.簡單介紹你目前的工做狀況面試
2.在這些工做項目當中有沒有哪些項目是你主導或者比較瞭解的,詳細說明一下狀況,包括技術的設計redis
3.由項目中所使用的框架,介紹一下對公司內部框架的具體實現(我這裏主要是亞信的CSF和AICACHE)算法
4.csf是怎麼實現的?spring
5.csf是亞信內部的分佈式通訊框架,經過zk去管理服務註冊和發現,那麼,若是當zk集羣壓力過大,是如何動態擴容和管理的?好比像阿里這樣體系的公司, 對於服務註冊和發現,能夠如何設計,去承載搞負載,高併發的,也就是主機集羣並無宕機,可是負載很高,如何作擴展和優化?數據庫
6.當前是一個服務提供者,我發佈了服務以後向zk註冊,此時,服務調用方來調用服務,會首先詢問zk我要調用的服務有哪些提供者,這些服務信息是緩存在 服務調用者這一方,仍是每次調用時都問zk要呢?設計模式
7.若是服務調用時,忽然提供服務的主機不可用了,好比由於網絡抖動調用不通,此時又是一個什麼樣的流程呢?數組
8.假如此時服務不可用的主機短期內又恢復了服務提供能力,又是一個怎樣的流程?
9.csf服務自己有路由規則的設計嗎?雙機房,相互容災,甚至是異地多機房相互容災,調同機櫃,同機房,同城,這些調用順序是如何設計的?csf服務是如何 作優先選擇的?或者說,服務有沒有進行過一些分組,相似場景,好比根據用戶id分組,50%用戶使用A服務提供者,另外50%使用B服務提供者,這樣的場景是如何實現的,有沒有這樣的一種策略在裏面呢?若是有的話,又是如何實現的?
10.服務註冊與發現以後,是對象的序列化,對序列化這塊,在Java裏瞭解有哪些具體的序列化方式呢?彼此之間的優劣是什麼樣的?在CSF裏又是怎麼作序列化的呢?
11.既然有第三方的序列化方式,說明java官方提供的序列化方式應該有一些很明顯或者很致命的缺點,你能說說是什麼嗎?
12.假如讓你來設計csf框架,剛好你負責序列化這一塊,你會怎麼來設計高可用,或者選擇哪些數據來進行壓縮,哪些數據又是不能壓縮的,壓縮以後確定會 帶來一些負面效果,這些負面有哪些,有具體瞭解過嗎? 好比說,原生的bmp圖片,我能夠壓縮成jpg圖片,那咱們知道,jgp圖片實際上是有損壓縮,雖然在 肉眼上其實分辨不出來,那這種壓縮它是如何作的呢?那還有一些是無損壓縮。你以爲protobuf是有損壓縮仍是無損壓縮呢?異構系統之間又是採起什麼樣 的序列化方式呢,能採用java原生的序列化機制來實現序列化傳輸嗎?
13.序列化傳輸以後,就是底層網絡傳輸了,那nio包也出來好久了,能說明一下nio主要是作了什麼,爲何要設計nio?以及nio裏面主要的類和接口嗎?這些類和接口分別是設麼做用能詳細描述一下嗎?nio是基於事件驅動機制來設計的,那nio裏哪一個類負責nio的事件驅動呢?
14.能說一下nio和aio的區別嗎?有了解過aio嗎?aio有哪些主要的類和接口,主要做用是什麼,能說明一下嗎?
15.對java8,java9,甚至java10有哪些重大版本的更新,有了解嗎?(面試官更想問的是java9和java10),java8有哪些至少是包級別的重大的功能更新,有了解過嗎?(我回答了了解ConcurrentHashMap put元素致使同一個hash桶元素多於8個時,會將鏈表轉化爲紅黑樹)
16.能具體說一下紅黑樹嗎?紅黑樹的具體實現?紅黑樹具體是如何提升性能的?紅黑樹如何作到動態調整的?
17.對於列表的流式處理(流處理)和Lamda表達式有接觸過嗎?
18.對於Garbage First(G1)垃圾回收器有了解過嗎?
19.對於其餘垃圾回收器有了解過嗎?
20.jvm應用啓動參數優化,有了解嗎?大家這邊項目當中有這樣操做過嗎?好比說,當你發佈應用上去,經過監控發現young GC和old gc數據比較異常,有沒 有試圖調全年輕代和老年代之間的空間比例,以及調整垃圾回收器,以達到性能調優的目的?
21.對類加載器有了解嗎?什麼樣的狀況下須要打破雙親委派模型?打破的方式是什麼樣子的?你能描述一下嗎?舉個場景,你如今有一個web應用程序,這個war包裏有a模塊和b模塊,a模塊依賴一個jar包的1.0版本,b模塊依賴這個jar包的2.0版本,這個jar包的1.0版本和2.0版本互不兼容,由於a,b模塊又在一個war包裏面,那就意味着這個jar包的1.0和2.0所有在這個應用程序內部,tomcat啓動的時候對jar包裏的同一個類只會加載一次,那麼如今狀況是,要麼a模塊起不來不能用了,要麼b模塊起不來不能用了,若是你是這個應用的owner,你怎麼辦?模塊代碼自己很難改,或者說比較複雜,a模塊沒法升級jar包,b模塊沒法降級jar包。
22.據說過osji嗎?你知道osgi主要功能是什麼嗎?它大概的一個實現原理又是什麼樣子?
23.前面都是我在問,你在回答,比較被動,你能夠說說你對那些技術或者開源框架有比較深刻的瞭解嗎?
24.選舉算法,能具體描述一下嗎?怎麼避免死循環的選舉方式呢?好比說,有三臺主機1,2,3,1主機選舉本身並向23發送選舉消息,2和3不一樣意,而後2主機選 舉本身而後也向1和3主機發送選舉消息,1和3主機也不一樣意,3主機也如法炮製,這個怎麼避免呢?要麼所有選本身,要麼所有選別人,你們都是一條,怎 麼辦呢?
25.能描述一下paxos算法的具體實現方式嗎?這個算法裏有哪些角色?
26.能描述一下raft算法,它裏面哪些角色和它整個選舉過程是怎麼樣的嗎?具體是如何選舉的?好比仍是有1,2,3三臺主機,1,2,3都分別發出選舉信息,要求 選舉本身,過程僵住了怎麼辦?paxos和raft是不同的處理,那raft是怎麼處理的?
27.redis是如何解決熱點問題的呢?dedis集羣是怎麼實現的呢,能跟我描述一下嗎?每臺redis從機上都是完整的數據嗎,若是這樣,數據是否是太過冗餘了? 那若是是這樣,應用在訪問緩存的時候,是隨機挑選一臺redis機器嗎?那怎麼保證不會隨機挑選到同一臺機器上去呢?redis數據切片這個概念有了解嗎?
28.~~~等(問了好多,後面寫不完了)。
看到這裏,大家能回答得出來多少,有多少是大家不能回答得上的?是否是內心此刻已經mmp了。不過大家不用擔憂,我此時我也懵了,內心想罵娘。不過心態不能慌呀~~~~
(內心想着,穩住,他沒我帥~~~~哈哈哈)
不知道大家看完了發現沒,就一個淘寶,就要懂不少知識點,那若是阿里巴巴,支付寶,等一線大廠呢?是否是感受本身還要學習的還有不少~
一、基本語法
這包括static、final、transient等關鍵字的做用,foreach循環的原理等等。今天面試我問你static關鍵字有哪些做用,若是你答出static修飾變量、修飾方法我會認爲你合格,答出靜態塊,我會認爲你不錯,答出靜態內部類我會認爲你很好,答出靜態導包我會對你很滿意,由於能看出你很是熱衷研究技術。
二、集合
很是重要,也是必問的內容。基本上就是List、Map、Set,問的是各類實現類的底層實現原理,實現類的優缺點。集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的實現原理,能流利做答,固然能掌握CopyOnWrite容器和Queue是再好不過的了。另外多說一句,ConcurrentHashMap的問題在面試中問得特別多,大概是由於這個類能夠衍生出很是多的問題,關於ConcurrentHashMap,我給網友朋友們提供三點回答或者是研究方向:
(1)ConcurrentHashMap的鎖分段技術
(2)ConcurrentHashMap的讀是否要加鎖,爲何
(3)ConcurrentHashMap的迭代器是強一致性的迭代器仍是弱一致性的迭代器
三、設計模式
設計模式在工做中仍是很是重要、很是有用的,23種設計模式中重點研究經常使用的十來種就能夠了,面試中關於設計模式的問答主要是三個方向:
(1)你的項目中用到了哪些設計模式,如何使用
(2)知道經常使用設計模式的優缺點
(3)能畫出經常使用設計模式的UML圖
四、多線程
這也是必問的一塊了。會問得深刻一些好比說Thread和Runnable的區別和聯繫、屢次start一個線程會怎麼樣、線程有哪些狀態。固然這只是最基本的,出乎意料地,幾回面試幾乎都被同時問到了一個問題,問法不盡相同,總結起來是這麼一個意思:假若有Thread一、Thread二、Thread三、Thread4四條線程分別統計C、D、E、F四個盤的大小,全部線程都統計完畢交給Thread5線程去作彙總,應當如何實現?
聰明的網友們對這個問題是否有答案呢?不難,java.util.concurrent下就有現成的類可使用。
另外,線程池也是比較常問的一塊,經常使用的線程池有幾種?這幾種線程池之間有什麼區別和聯繫?線程池的實現原理是怎麼樣的?實際一些的,會給你一些具體的場景,讓你回答這種場景該使用什麼樣的線程池比較合適。最後,雖然此次面試問得很少,可是多線程同步、鎖這塊也是重點。synchronized和ReentrantLock的區別、synchronized鎖普通方法和鎖靜態方法、死鎖的原理及排查方法等等
五、IO
IO分爲File IO和Socket IO,File IO基本上是不會問的,問也問不出什麼來,平時會用就行了,另外記得File IO都是阻塞IO。Socket IO是比較重要的一塊,要搞懂的是阻塞/非阻塞的區別、同步/異步的區別,藉此理解阻塞IO、非阻塞IO、多路複用IO、異步IO這四種IO模型,Socket IO如何和這四種模型相關聯。這是基本一些的,深刻一些的話,就會問NIO的原理、NIO屬於哪一種IO模型、NIO的三大組成等等,這有些難,當時我也是研究了好久才搞懂NIO。提一句,NIO並非嚴格意義上的非阻塞IO而應該屬於多路複用IO,面試回答的時候要注意這個細節,講到NIO會阻塞在Selector的select方法上會增長面試官對你的好感。若是用過Netty,可能會問一些Netty的東西,畢竟這個框架基本屬於當前最好的NIO框架了(Mina其實也不錯,不過整體來講仍是比不上Netty的),大多數互聯網公司也都在用Netty。
六、JDK源碼
要想拿高工資,JDK源碼不可不讀。上面的內容可能還和具體場景聯繫起來,JDK源碼就是實打實地看你平時是否是愛鑽研了。
JDK源碼其實沒什麼好總結的,純粹看我的,總結一下比較重要的源碼:
(1)List、Map、Set實現類的源代碼
(2)ReentrantLock、AQS的源代碼
(3)AtomicInteger的實現原理,主要能說清楚CAS機制而且AtomicInteger是如何利用CAS機制實現的
(4)線程池的實現原理
(5)Object類中的方法以及每一個方法的做用
七、框架
老生常談,面試必問的東西。通常來講會問你一下大家項目中使用的框架,而後給你一些場景問你用框架怎麼作,好比我想要在Spring初始化bean的時候作一些事情該怎麼作、想要在bean銷燬的時候作一些事情該怎麼作、MyBatis中$和#的區別等等,這些都比較實際了,平時積累得好、有多學習框架的使用細節天然都不成問題。
若是上面你的問題答得好,面試官每每會深刻地問一些框架的實現原理。問得最多的就是Spring AOP的實現原理,固然這個很簡單啦,兩句話就搞定的的事兒,即便你不會準備一下就行了。
八、數據庫
數據庫十有八九也都會問到。一些基本的像union和union all的區別、left join、幾種索引及其區別就不談了,比較重要的就是數據庫性能的優化,若是對於數據庫的性能優化一竅不通,那麼有時間,仍是建議你在面試前花一兩天專門把SQL基礎和SQL優化的內容準備一下。
不過數據庫卻是不用擔憂,一家公司每每有不少部門,若是你對數據庫不熟悉而基本技術又很是好,九成都是會要你的,估計會先把你放到對數據庫使用不是要求很是高的部門鍛鍊一下。
九、數據結構和算法分析
數據結構和算法分析,對於一名程序員來講,會比不會好並且在工做中絕對能派上用場。數組、鏈表是基礎,棧和隊列深刻一些但也不難,樹挺重要的,比較重要的樹AVL樹、紅黑樹,能夠不瞭解它們的具體實現,可是要知道什麼是二叉查找樹、什麼是平衡樹,AVL樹和紅黑樹的區別。
十、Java虛擬機
Java虛擬機應該是很重要的一塊內容,談談Java虛擬機中比較重要的內容
也許這些內容面試無用,但在走向大牛的路上,不可不會。
十一、Web方面的一些問題
Java主要面向Web端,所以Web的一些問題也是必問的。
這兩個問題以外,web.xml裏面的內容是重點,Filter、Servlet、Listener,不說對它們的實現原理一清二楚吧,至少能對它們的使用知根知底。另外,一些細節的方面好比get/post的區別、forward/重定向的區別、HTTPS的實現原理也均可能會被考察到。
最後,若是有興趣有時間,建議學習、研究一下SOA和RPC,面向服務體系,大型分佈式架構必備,救命良方、包治百病、屢試不爽。
若是你過五關斬六將,成功地經過了全部的技術面,那麼恭喜你,你離升職加薪、出任CEO、迎娶白富美、走向人生巔峯又進了一步。可是尚未到談薪資待遇的時候,最後還有一個考驗:HR面試。基本全部的大公司都有這一輪的面試,不要小看HR面試,不少公司的HR對於面試者都有一票否決權的----即便前面的面試對你的評價再高。
因此,這輪的面試也必須重視起來,HR面試主要問的是幾點:
若是你們想學習一下路線內容,在此我向你們推薦一個架構學習交流羣。交流學習羣號:833145934 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
1、源碼分析
2、分佈式架構
3、微服務
4、性能優化
5、Java工程化
好了,個人總結就到這裏了,若是大家也想面試BAT,建議大家把基礎學好,偷偷的告訴大家,他們都是很喜歡問基礎知識的哦......如今想着那個面試官,真心感受他沒我帥~~~~哈哈哈哈。你們能夠關注個人公衆號:《Java爛豬皮》,日常我也會發寫技術文章,好比:架構,分佈式,微服務spring,jvm,MySQL等知識點。面試經驗也會分享給你們。在此謝謝你們的關注支持~~~~