1. 程式人生 > >BAT蘑菇街等Java社招面試總結一二

BAT蘑菇街等Java社招面試總結一二

畢業之後工作兩年有餘,對現在的工作及工作環境有些不滿,出來找下工作,看看外面的世界,同時也試下自己的水平。

至今共面試了多家公司,包括大廠阿里、網易、蘑菇街等、也有多家創業型公司,收到多個offer。由於面試策略問題,都不是非常滿意。下面總結下本次面試的經歷,引以為戒。

氛圍最輕鬆的是網易,止步於一面,是一個比較年輕的面試官,隨便在大堂裡找了個空座就聊了起來,範圍很廣,對基礎要求較深。最土豪的是蘑菇街,到場後會給你衝杯咖啡喝,止步於一面,招聘的是中介軟體的工程師,對技術要求較深,面試官比較高冷。

首先總結下阿里的面試。面試時間安排在下午一點,猶豫面試地點距離很遠,所以趕到的時候已經一點了,還沒吃午飯,匆匆在公司超市裡面買了幾個小麵包充飢。面試官看上去像是四十歲左右的技術大拿,首先讓我做了下自我介紹,然後問了我幾個基本的問題:hashMap和concurrentHashMap的區別,內部實現原理,stringBuild和stringBuffer的區別等。然後讓寫一個單例模式的實現(這個沒寫好,缺了幾個關鍵字,給面試官一個很差的印象,基礎不太好)。然後基本上看著簡歷問了,做過專案嗎?在專案中國解決了哪些問題,看過開原始碼嗎?struct2的工作原理是什麼,一通連環問,有點蒙了。主要還是本人平時積累的知識不夠,掌握的不夠熟練啊。然後問jvm的記憶體結構有哪些,Linux寫過shell嗎,能直接寫一下嗎?你理解的高可用是什麼,能實現秒殺嗎?回答了兩種,但沒有描述具體。面試官有些失望了,給我最後一個救命的稻草,問我一個智力題,燒香算時間的問題,這麼容易的題我當時竟然也蒙了,唉!失望啊!game over!

然後第二天去面試蘑菇街,本來按照阿里的套路準備了一下,但是過去之後面試方法完全不同。首先讓自我介紹,然後主要看著簡歷中寫到的東西提問。負載均衡的處理有哪些方式,lvs瞭解嗎,你們為什麼從iphash轉到了使用最小連結的負載演算法。平臺的使用者總量,這個回答估計直接被鄙視了。mq的p2p模式,阿里的中介軟體技術瞭解嗎。然後問為什麼從memcach遷到了redis,使用redis中遇到了哪些問題,這個估計直接掛了。然後就沒有然後了。

其他兩家小公司面的也類似,問一些基礎知識,然後問專案中解決的問題!主要關注高併發的問題等!

需要總結的知識點比較多,主要還是平時要多積累吧,用到的東西要知道所以然,不能只停留在表面的使用。

比如concurrentHashMap內部結構、ajax請求的封裝物件、負載均衡的幾種策略,redis設定過期時間的實現原理,redis的併發操作資料怎麼保證安全性。

Nginx輪詢的實現原理、spring的事物及實現模式,資料庫優化的策略,索引的資料結構。

springMVC的工作原理,常用的設計模式,ajax非同步重新整理實現的步驟,如何判斷是Ajax請求。

servlet的生命週期,怎麼判斷是get請求還是post請求,後臺實現session共享的方法。過濾器和攔截器的區別。

同花順的搜尋實現方案,Linux命令直接搜尋大文件中的幾行內容,按熱度實現推薦演算法的方案,單例模式獲取到兩個項例項的方案。

分庫分表實踐,Nginx輪詢實現原理(元件的實現),序列化的原理,分散式一致性解決方案。

redis的鎖機制,treeMap實現原理,一致性hash原理,同步鎖,TCP/UDP的區別,說一下TCP的三次握手(建立連線)和四次揮手(四次揮手)。

其它知識(服務化《微服務、dubbo、併發、restful、NIO、序列化、springBoot、分散式》)。

Java8的一些新特性介紹。專案中遇到的問題,印象最深的問題!

執行緒程序的區別,Nginx負載均衡、LVS負載均衡,對springBoot理解,spring的增強方式,AOP,ZK保證一致性的方法,分散式事務的實現方式,分散式鎖,分散式一致性,redis分散式鎖;

還有很多東西要總結,有時間繼續補上。。。

*關於TCP的三次握手、四次揮手:

為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
答:因為在建立連線時,當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。

但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。

為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網路是不可靠的,有可以最後一個ACK丟失。

所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。