我認識不少在美團工作的朋友默赂,從他們口中得知美團的技術(shù)面試,面試官都會從幾百道基礎(chǔ)題中隨機拿十來道來考察應(yīng)聘者的基礎(chǔ)實力方库,只有過了這些基礎(chǔ)才會有下文吕嘀,我記得我的讀者中曾經(jīng)有一位分享過美團的面試成功的經(jīng)歷《圈內(nèi)小伙伴美團點評校招面試經(jīng)驗分享》,而今天分享經(jīng)歷的這位小伙伴還是有點遺憾翎卓,掛在最后一輪契邀。
原文如下。
一面
1失暴、自我介紹
答:自我介紹是面試中唯一的自己主動介紹自己的環(huán)節(jié)坯门,一定要好好把握好微饥,你數(shù)據(jù)結(jié)構(gòu)學的號可以手撕一個紅黑樹你就說我數(shù)據(jù)結(jié)構(gòu)掌握地很好,反正就是要把自己的優(yōu)勢凸顯出來古戴,比如我是保研的以及對于java的知識較熟悉欠橘,我介紹完自己的本科經(jīng)歷以后,我就說我是保送到本校繼續(xù)讀研究生现恼,然后最末尾會加上自己熟悉java肃续,然后面試官就會問java的一些東西;
2叉袍、項目介紹及其亮點
答:開始吹牛逼始锚。。喳逛。
3瞧捌、Java的8種數(shù)據(jù)類型有哪些?
答:感覺這個問題被問爛了润文,int,short,long,float,double,byte,boolean,char;
3姐呐、問了Integer緩存數(shù)據(jù)的范圍?
答:-128-127
4典蝌、緊接著問了Object類有哪些方法曙砂?
答:這個我有背過,clone,getClass,toString,finalize,equals,hashCode,wait,notify,notifyALL赠法。
5麦轰、問到這里然后拿出了一個題,面試官有小紙條砖织,題目在上面款侵,String A = "123"; String B = new String("123");,問我生成了幾個String對象侧纯?
答:我說如果常量池中新锈,原來沒有“123”那么就是生成了2個對象,如果常量池中有“123”那么只要1個對象生成眶熬。
6妹笆、由于提到了wait,順帶問了wait和sleep有什么區(qū)別?
答:wait 的話會釋放對象鎖娜氏,sleep 的話不會釋放的對象鎖拳缠。
7、由于還提及了hashcode贸弥,面試官接著問我窟坐,hashcode用在哪里?
答:這個我不假思索地說,hashmap和ConcurrentMap哲鸳,這里我猜面試官肯定要繼續(xù)問我這兩個東西了臣疑。
8、果不其然徙菠,面試官說讯沈,講一講hashmap?
答:hashmap我講了hashmap的數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表結(jié)構(gòu),講了hashmap的put,get,擴容的底層原理婿奔,同時講了hashmap在1.7與1.8中的區(qū)別缺狠,put中引入了紅黑樹,以及擴容的時候不同脸秽,這些就講了挺長時間儒老,最后我說了一句hashmap不是線程安全的蝴乔。
9记餐、這里提及了hashMap是非線程安全的,面試問我為啥不是線程安全的薇正,舉幾個例子片酝?
答:我說了,在擴容的時候hashmap會可能產(chǎn)生環(huán)挖腰,造成死循環(huán)雕沿;hashmap在插入新的階段的時候,多個線程同時插入猴仑,會把除了最后的那個線程的其它線程插入的結(jié)點丟失审轮;對于修改的時候,多個線程修改辽俗,對只保留最后的一個線程的修改結(jié)果疾渣;擴容的時候,會只保留最后一個線程的擴容后的那個數(shù)組崖飘;從擴容修改增加說了一遍榴捡;
10、我本以為要接著問ConCurrentMap朱浴,額吊圾,出乎我的意料,并沒有問翰蠢,可能覺得我hashmap準備的很充分项乒,然后接著問了我JVM了解嗎?
答:我說了解梁沧;
11檀何、讓我說意思JVM的分為哪幾塊?
答:方法區(qū),虛擬機棧埃碱,本地方法棧猖辫,堆,程序計數(shù)器砚殿,然后我就自己沒等面試官問新的問題啃憎,繼續(xù)接著說,方法區(qū)和堆是線程共享的似炎,虛擬機棧本地方法棧和程序計數(shù)器是線程私有的辛萍,除了程序技術(shù)器不會發(fā)生內(nèi)存溢出,其它都會發(fā)生內(nèi)存溢出羡藐,并說了哪些會發(fā)生堆溢出哪些會發(fā)生棧溢出贩毕;這里就是大家要學會自己吧啦吧啦地說一堆,因為據(jù)我觀察每個面試官面試每個是有一個固定時間的仆嗦,超過這個時間段就結(jié)束了辉阶,所以只要面試官不打斷你,你就一頓說瘩扼;
12谆甜、由于提及到了內(nèi)存溢出,面試官問我內(nèi)存溢出和內(nèi)存泄漏的區(qū)別集绰?
答:內(nèi)存泄露我說就是一塊申請了一塊內(nèi)存以后规辱,無法去釋放掉這塊內(nèi)存,丟失了這段內(nèi)存的引用栽燕;內(nèi)存溢出就是申請的內(nèi)存不夠罕袋,撐不起我們需要的內(nèi)存;
13碍岔、這里問完我就去問了數(shù)據(jù)庫浴讯,4大特性是啥,舉個例子付秕?
答:原子性兰珍,我說就是一個事務(wù)要么全部完成,要么全部失敗询吴,要么做要么不做掠河;一致性,比如a+b=100,一個事務(wù)改變了a比如增加了a的值猛计,那么必須同時改變b唠摹,保證在事務(wù)結(jié)束以后a+b=100依然成立奉瘤,這就是一致性勾拉;持久性,額就是修改完以后双霍,在數(shù)據(jù)庫中生效是永久的均芽;隔離性,我就是說對于A對B進行轉(zhuǎn)賬,A沒把這個交易完成的時候,B是不知道A要給他轉(zhuǎn)錢毕贼。
14待秃、數(shù)據(jù)的隔離級別有啥,每個隔離級別舉個例子淹辞?
答:額,(怎么都要舉例子啊莉给,啊啊啊啊~),內(nèi)心波瀾滞时,臉上面無表情地說:1.未提交讀叁幢,事務(wù)中發(fā)生了修改,即使沒有提交坪稽,其它事務(wù)也是可見的曼玩,舉例子我就說對于一個數(shù)A原來50修改為100,但是我還沒有提交修改窒百,另一個事務(wù)看到這個修改黍判,而這個時候原事務(wù)發(fā)生了回滾,這時候A還是50篙梢,但是另一個事務(wù)看到的A是100顷帖,這就是未提交讀;2.提交讀渤滞,就是說贬墩,對于一個事務(wù)從開始直到提交之前,所做的任何修改是其它事務(wù)不可見的蔼水,舉例就是對于一個數(shù)A原來是50震糖,然后提交修改成100,這個時候另一個事務(wù)在A提交修改之前趴腋,讀取到了A是50吊说,剛讀取完论咏,A就被修改成100了,這個時候另一個事務(wù)再進行讀取發(fā)現(xiàn)A就突然變成100了颁井;3.可重復讀厅贪;可重復讀,就是對于一個記錄讀取多次的記錄是相同的雅宾,舉例就是對于一個數(shù)A讀取的話一直是A养涮,前后兩次讀取到的A是一致的;可串行化讀眉抬,就是說在并發(fā)情況下贯吓,和串行化的讀取的結(jié)果是一致的,沒有什么不同蜀变,這個舉例我就說悄谐,不會發(fā)生臟讀和幻讀;然后數(shù)據(jù)庫這一塊就過去了库北。
15爬舰、接著問我計算機網(wǎng)絡(luò),問了我7層有哪7層寒瓦?
答:物理層情屹,數(shù)據(jù)鏈路層,網(wǎng)絡(luò)層杂腰,傳輸層垃你,會話層,表示層颈墅,應(yīng)用層蜡镶;
16、接著問了我TCP在哪層恤筛,UDP在哪層,HTTP在哪層芹橡?
答:TPC和UDP在傳輸層毒坛,然后HTTP問我在哪個層,我一下有點忘了林说,這個沒答上來煎殷,會去看了是在應(yīng)用層。
17腿箩、問到這里就結(jié)束了豪直,然后面試官問我有啥想問的,我就問如何評價我的面試表現(xiàn)珠移?
答:因為一面都是問基礎(chǔ)的知識弓乙,面試官和我說末融,我感覺你基礎(chǔ)很扎實,他直接和我說我這里的話是通過的暇韧,不知道后面的面試官怎么問你勾习,然后我說了聲謝謝,就去酒店的一個會議廳等待二面懈玻;
二面
一面過了沒多久巧婶,就立馬通知二面了,中途感覺有點餓了涂乌,美團還挺人性話的艺栈,在后面的桌子上放了一堆餅干,忘了餅干的名字了湾盒,總之特別好吃湿右,我吃了好幾塊。
1历涝、自我介紹
2诅需、項目介紹,及其亮點介紹荧库。
答:繼續(xù)吹牛逼堰塌。
3、然后問了我集合了解嗎分衫,讓我說話ArrayList和LinkedList的區(qū)別场刑?
答:ArrayList底層是數(shù)組,LinkedList底層是鏈表蚪战,ArrayLIst查找數(shù)據(jù)快牵现,LinkedList插入刪除快;
4邀桑、繼續(xù)問我linkedList可以用for循環(huán)遍歷嗎瞎疼?
答;能不用盡量不要用,linkedList底層是鏈表壁畸,它使用for進行遍歷贼急,訪問每一個元素都是從頭開始訪問然后直到找到這個元素,比如說找第三個節(jié)點捏萍,需要先找到第一個節(jié)點然后找到第二個節(jié)點太抓;繼續(xù)找第4個節(jié)點,不是從第三個節(jié)點開始找的令杈,還是從第一個節(jié)點開始走敌,所以非常的慢,不推薦逗噩,可以用迭代器進行遍歷掉丽。
5跌榔、介紹一下ConCurrenthashmap
答:我感覺是因為一面問了hashmap,所以二面面試官可能是看見了面試記錄机打,額矫户,這塊我非常熟,這個我又講了很長時間残邀,講了ConCurrentHashMap的底層的分段鎖的結(jié)構(gòu)皆辽,講了ConCurrentHashmap的get源碼,get源碼是沒有使用鎖的芥挣,這里我把get源碼背寫了下來驱闷,并給面試官講了get源碼在插入修改刪除的多線程下是安全的;然后講了put操作空免,remove,擴容操作空另,然后講了在1.7和1.8的區(qū)別,引入了紅黑樹蹋砚,鏈表長度大于8轉(zhuǎn)換成紅黑樹扼菠,采用了CAS+synchronized來保證并發(fā)安全,吧啦吧啦又講了挺長時間坝咐;
6循榆、來看看這道題,說著拿出來一個小紙條
答:這個紙條感覺每個面試官都是只有紙條墨坚,所以盡可能地和周圍的同學多交流秧饮,有一定的肯可能他的面試官就你的面試官。題目:讓我自己手算a,b,c,d的值泽篮。
結(jié)果是a = 8b=5,c=7,d=35.計算完我問他對不對盗尸,他沒勒我。帽撑。泼各。
7、然后問我單利模式了解不亏拉,寫一個單例模式历恐?
答:這個之前準備過,我寫了一個雙重鎖的單例模式专筷。
8、接著問了我虛擬機了解嗎蒸苇,介紹一些虛擬機的內(nèi)存模型磷蛹?
答:這個之前也準備過,這里要注意了溪烤,虛擬機的內(nèi)存模型和運行時的數(shù)據(jù)區(qū)域不是一回事味咳;虛擬機內(nèi)存模型又叫JMM庇勃,就是每個線程有自己的工作內(nèi)存,然后又一個主內(nèi)存槽驶,線程工作的時候都是在自己的工作內(nèi)存中拷貝一個主內(nèi)存的副本责嚷;還說了JMM的happens before原則,程序順序原則掂铐,鎖原則罕拂,線程中斷原則,傳遞性原則全陨,還有其他的沒想起來就沒說了爆班。
9、介紹一些你了解的垃圾回收算法辱姨?
答:標記清除柿菩,標記整理,復制算法雨涛,把每個算法是啥說了一遍枢舶;
10、問到這里替久,問了我你知道SurvivorRatio這個參數(shù)為啥初始是默認的8:1:1嗎凉泄?
答:這個由于剛才剛問了垃圾回收算法,我覺得可能有關(guān)聯(lián)侣肄,于是我說旧困,方便復制算法操作,Eden區(qū)域大多數(shù)都是朝生夕死的稼锅,這個比例吼具,可以方便復制算法的中from和to來回進行復制存活的對象,額矩距,說完拗盒,他沒有說啥,感覺是默許了吧锥债;
11陡蝇、突然又問,二叉樹了解嗎哮肚,寫一個二叉樹的深度搜索遍歷登夫?
答:當時我聽到中道題,有點懵允趟,什么是二叉樹的深度搜索遍歷恼策,我只知道層次遍歷,前序后序中序遍歷啊潮剪,我想了想涣楷,感覺和后序遍歷挺像的分唾,我覺得應(yīng)該就是后序遍歷吧,我就先寫了個后序遍歷的遞歸寫法狮斗。
然后他看了一眼绽乔,沒說啥,感覺這個面試官有點話少冷淡碳褒,全程不和我互動折砸,emmmm....下來自己百度了下,對的骤视。鞍爱。。
這個代碼問完我专酗,讓后讓我去等通知睹逃,我感覺回答的還行,果然沒過幾分鐘祷肯,通知我去三面沉填;
三面
1、照例自我介紹和項目介紹佑笋;
2翼闹、上來就讓我手撕一個單例模式。蒋纬。猎荠。
答:繼續(xù)寫我的雙重鎖模式
3、讓我講了講代碼是啥啥意思蜀备?
答:STEP 1. 線程A訪問getInstance()方法关摇,因為單例還沒有實例化,所以進入了鎖定塊碾阁。STEP 2. 線程B訪問getInstance()方法输虱,因為單例還沒有實例化,得以訪問接下來代碼塊脂凶,而接下來代碼塊已經(jīng)被線程1鎖定宪睹。STEP 3. 線程A進入下一判斷,因為單例還沒有實例化蚕钦,所以進行單例實例化亭病,成功實例化后退出代碼塊,解除鎖定嘶居。STEP 4. 線程B進入接下來代碼塊命贴,鎖定線程,進入下一判斷,因為已經(jīng)實例化胸蛛,退出代碼塊,解除鎖定樱报。STEP 5. 線程A初始化并獲取到了單例實例并返回葬项,線程B獲取了在線程A中初始化的單例。大體是這么回事迹蛤。
4民珍、由于我的項目中提及到JVM,所以給我出了一個場景題盗飒,垃圾會收器中嚷量,標記清除多次后,由于采用的是標記清除算法逆趣,那么你覺得可能會出現(xiàn)什么問題蝶溶?
答:然后我說由于產(chǎn)生了內(nèi)存碎片,所以當分配一個大對象的時候宣渗,由于內(nèi)存不連續(xù)抖所,那么會產(chǎn)生full GC。
5痕囱、這里提及到了full gc,問我田轧,哪些情況會產(chǎn)生full GC,哪些情況產(chǎn)生minor GC?
答:minor會產(chǎn)生在eden區(qū)滿了,fullGC產(chǎn)生在老年代的剩余空間不足鞍恢,以及永久代內(nèi)存不足也會發(fā)生fullGC傻粘。
6、除了你項目中的內(nèi)存溢出問題帮掉,你還知道哪些關(guān)于內(nèi)存溢出內(nèi)存泄漏的弦悉?
答:這里之前了解過ThreadLocal,我說,ThreadLocal中的鍵值對中的鍵是一個弱引用旭寿,那么在內(nèi)存回收的時候警绩,這個鍵很可能會被回收掉,然后鍵沒了盅称,就無法找到value的值肩祥,造成了內(nèi)存泄漏;
7缩膝、然后給我出了一個動態(tài)規(guī)劃的手寫代碼題混狠,說來寫個代碼吧,大體是在n*m的矩陣方格中疾层,找一個最大的正方形是幾乘幾的将饺,有點忘了。
答:由于沒有準備過動態(tài)規(guī)劃的題目橱鹏,這個題目看到我只說了暴力解決的方法卖子,然后面試官提示讓我用動態(tài)規(guī)劃做郑兴,我想了半天沒想出來犹菇。蜘矢。逸尖。崔泵。當時感覺應(yīng)該是涼了颠通。蚓庭。致讥。
時間差不多的時候,面試官說器赞,就到這里吧垢袱,然后讓我出去等通知,果然通知我今天面試結(jié)束了港柜,整整一個下午请契,特別特別累,前兩面結(jié)束的時候感覺特別穩(wěn)潘懊,沒想到最后還是因為手寫代碼這一塊不會動態(tài)規(guī)劃掛掉了姚糊,當時感覺心態(tài)有點崩。授舟。救恨。
結(jié)束語
最終美團面試還是掛了,释树,肠槽,留下了沒有技術(shù)的眼淚。奢啥。秸仙。所以痛下決心要好好學習算法,這不今天又刷了一道 leetcode桩盲。