查看: 726|回復: 0

來之不易的美團面試,結果居然掛了……(附面試答案)

發表于 2018-11-3 20:55:21
一面
自我介紹
答:自我介紹是面試中唯一的自己主動介紹自己的環節,一定要好好把握好,你數據結構學的號可以手撕一個紅黑樹你就說我數據結構掌握地很好,反正就是要把自己的優勢凸顯出來,比如自己對于java的知識較熟悉,我介紹完自己的本科經歷以后,我就說我是保送到本校繼續讀研究生,然后最末尾會加上自己熟悉java,然后面試官就會問java的一些東西;
項目介紹及其亮點
答:使勁吹...
java的8種數據類型有哪些?
答:感覺這個問題被問爛了,int,short,long,float,double,byte,boolean,char;
問了Integer緩存數據的范圍?
答:-128-127
緊接著問了Object類有哪些方法?
答:這個我有背過,clone,getClass,toString,finalize,equals,hashCode,wait,notify,notifyALL。(不懂面試這個什么意思)
問到這里然后拿出了一個題,面試官有小紙條,題目在上面,String A = "123"; String B = new String("123");,問我生成了幾個String對象?
答:我說如果常量池中,原來沒有“123”那么就是生成了2個對象,如果常量池中有“123”那么只要1個對象生成(面試官別他媽的問這種問題了)
由于提到了wait,順帶問了wait和sleep有什么區別?
答:wait的話會釋放對象鎖,sleep的話不會釋放的對象鎖
由于還提及了hashcode,面試官接著問我,hashcode用在哪里?
答:這個我不假思索地說,hashmap和ConcurrentMap,這里我猜面試官肯定要繼續問我這兩個東西了。
果不其然,面試官說,講一講hashmap?
答:hashmap我講了hashmap的數據結構數組鏈表結構,講了hashmap的put,get,擴容的底層原理,同時講了hashmap在1.7與1.8中的區別,put中引入了紅黑樹,以及擴容的時候不同,這些就講了挺長時間,最后我說了一句hashmap不是線程安全的。
這里提及了hashMap是非線程安全的,面試問我為啥不是線程安全的,舉幾個例子?
答:我說了,在擴容的時候hashmap會可能產生環,造成死循環;hashmap在插入新的階段的時候,多個線程同時插入,會把除了最后的那個線程的其它線程插入的結點丟失;對于修改的時候,多個線程修改,對只保留最后的一個線程的修改結果;擴容的時候,會只保留最后一個線程的擴容后的那個數組;從擴容修改增加說了一遍;
我本以為要接著問ConCurrentMap,額,出乎我的意料,并沒有問,可能覺得我hashmap準備的很充分,然后接著問了我JVM了解嗎?
答:我說了解;
讓我說意思JVM的分為哪幾塊?
答:方法區,虛擬機棧,本地方法棧,堆,程序計數器,然后我就自己沒等面試官問新的問題,繼續接著說,方法區和堆是線程共享的,虛擬機棧本地方法棧和程序計數器是線程私有的,除了程序技術器不會發生內存溢出,其它都會發生內存溢出,并說了哪些會發生堆溢出哪些會發生棧溢出;這里就是大家要學會自己吧啦吧啦地說一堆,因為據我觀察每個面試官面試每個是有一個固定時間的,超過這個時間段就結束了,所以只要面試官不打斷你,你就一頓說;
由于提及到了內存溢出,面試官問我內存溢出和內存泄漏的區別?
答:內存泄露我說就是一塊申請了一塊內存以后,無法去釋放掉這塊內存,丟失了這段內存的引用;內存溢出就是申請的內存不夠,撐不起我們需要的內存;
這里問完我就去問了數據庫,4大特性是啥,舉個例子?
答:原子性,我說就是一個事務要么全部完成,要么全部失敗,要么做要么不做;一致性,比如a+b=100,一個事務改變了a比如增加了a的值,那么必須同時改變b,保證在事務結束以后a+b=100依然成立,這就是一致性;持久性,額就是修改完以后,在數據庫中生效是永久的;隔離性,我就是說對于A對B進行轉賬,A沒把這個交易完成的時候,B是不知道A要給他轉錢。
數據的隔離級別有啥,每個隔離級別舉個例子?
答:額,(怎么都要舉例子啊,啊啊啊啊~),內心波瀾,臉上面無表情地說:1.未提交讀,事務中發生了修改,即使沒有提交,其它事務也是可見的,舉例子我就說對于一個數A原來50修改為100,但是我還沒有提交修改,另一個事務看到這個修改,而這個時候原事務發生了回滾,這時候A還是50,但是另一個事務看到的A是100,這就是未提交讀;2.提交讀,就是說,對于一個事務從開始直到提交之前,所做的任何修改是其它事務不可見的,舉例就是對于一個數A原來是50,然后提交修改成100,這個時候另一個事務在A提交修改之前,讀取到了A是50,剛讀取完,A就被修改成100了,這個時候另一個事務再進行讀取發現A就突然變成100了;3.可重復讀;可重復讀,就是對于一個記錄讀取多次的記錄是相同的,舉例就是對于一個數A讀取的話一直是A,前后兩次讀取到的A是一致的;可串行化讀,就是說在并發情況下,和串行化的讀取的結果是一致的,沒有什么不同,這個舉例我就說,不會發生臟讀和幻讀;然后數據庫這一塊就過去了。
接著問我計算機網絡,問了我7層有哪7層?
答:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層;
接著問了我TCP在哪層,UDP在哪層,HTTP在哪層?
答:TPC和UDP在傳輸層,然后HTTP問我在哪個層,我一下有點忘了,這個沒答上來,會去看了是在應用層。
問到這里就結束了,然后面試官問我有啥想問的,我就問如何評價我的面試表現?
答:因為一面都是問基礎的知識,面試官和我說,我感覺你基礎很扎實,他直接和我說我這里的話是通過的,不知道后面的面試官怎么問你,然后我說了聲謝謝,就去酒店的一個會議廳等待二面;
二面
一面過了沒多久,就立馬通知二面了,中途感覺有點餓了,美團還挺人性話的,在后面的桌子上放了一堆餅干,忘了餅干的名字了,總之特別好吃,我吃了好幾塊。
自我介紹
項目介紹,及其亮點介紹。
然后問了我集合了解嗎,讓我說話ArrayList和LinkedList的區別?
答:ArrayList底層是數組,LinkedList底層是鏈表,ArrayLIst查找數據快,LinkedList插入刪除快;
繼續問我linkedList可以用for循環遍歷嗎?
答:能不用盡量不要用,linkedList底層是鏈表,它使用for進行遍歷,訪問每一個元素都是從頭開始訪問然后直到找到這個元素,比如說找第三個節點,需要先找到第一個節點然后找到第二個節點;繼續找第4個節點,不是從第三個節點開始找的,還是從第一個節點開始,所以非常的慢,不推薦,可以用迭代器進行遍歷。
介紹一下ConCurrenthashmap
答:我感覺是因為一面問了hashmap,所以二面面試官可能是看見了面試記錄,額,這塊我非常熟,這個我又講了很長時間,講了ConCurrentHashMap的底層的分段鎖的結構,講了ConCurrentHashmap的get源碼,get源碼是沒有使用鎖的,這里我把get源碼背寫了下來,并給面試官講了get源碼在插入修改刪除的多線程下是安全的;然后講了put操作,remove,擴容操作,然后講了在1.7和1.8的區別,引入了紅黑樹,鏈表長度大于8轉換成紅黑樹,采用了CAS+synchronized來保證并發安全,吧啦吧啦又講了挺長時間;
來看看這道題,說著拿出來一個小紙條
答:這個紙條感覺每個面試官都是只有紙條,所以盡可能地和周圍的同學多交流,有一定的肯可能他的面試官就你的面試官。題目:讓我自己手算a,b,c,d的值,




結果是
a
=
8, b
=
5
,
c
=
7
,
d
=
35
計算完我問他對不對,他沒勒我。。。
然后問我單利模式了解不,寫一個單例模式?
答:這個之前準備過,我寫了一個雙重鎖的單例模式。




建議不要寫這種單例模式,或者直接把那幾種都寫出來
接著問了我虛擬機了解嗎,介紹一些虛擬機的內存模型?
答:這個之前也準備過,這里要注意了,虛擬機的內存模型和運行時的數據區域不是一回事;虛擬機內存模型又叫JMM,就是每個線程有自己的工作內存,然后又一個主內存,線程工作的時候都是在自己的工作內存中拷貝一個主內存的副本;還說了JMM的happens before原則,程序順序原則,鎖原則,線程中斷原則,傳遞性原則,還有其他的沒想起來就沒說了。
介紹一些你了解的垃圾回收算法?
答:標記清除,標記整理,復制算法,把每個算法是啥說了一遍;
問到這里,問了我你知道SurvivorRatio這個參數為啥初始是默認的8:1:1嗎?
答:這個由于剛才剛問了垃圾回收算法,我覺得可能有關聯,于是我說,方便復制算法操作,Eden區域大多數都是朝生夕死的,這個比例,可以方便復制算法的中from和to來回進行復制存活的對象,額,說完,他沒有說啥,感覺是默許了吧;
突然又問,二叉樹了解嗎,寫一個二叉樹的深度搜索遍歷?
答:當時我聽到中道題,有點懵,什么是二叉樹的深度搜索遍歷,我只知道層次遍歷,前序后序中序遍歷啊,我想了想,感覺和后序遍歷挺像的,我覺得應該就是后序遍歷吧,我就先寫了個后序遍歷的遞歸寫法




然后他看了一眼,沒說啥,感覺這個面試官有點話少冷淡,全程不和我互動,emmmm....下來自己百度了下,對的。。。
這個代碼問完我,讓后讓我去等通知,我感覺回答的還行,果然沒過幾分鐘,通知我去三面;
三面
照例自我介紹和項目介紹;
上來就讓我手撕一個單例模式。。。
答:繼續寫我的雙重鎖模式




讓我講了講代碼是啥啥意思?
答:
STEP 1. 線程A訪問getInstance()方法,因為單例還沒有實例化,所以進入了鎖定塊。
STEP 2. 線程B訪問getInstance()方法,因為單例還沒有實例化,得以訪問接下來代碼塊,而接下來代碼塊已經被線程1鎖定。
STEP 3. 線程A進入下一判斷,因為單例還沒有實例化,所以進行單例實例化,成功實例化后退出代碼塊,解除鎖定。
STEP 4. 線程B進入接下來代碼塊,鎖定線程,進入下一判斷,因為已經實例化,退出代碼塊,解除鎖定。
STEP 5. 線程A初始化并獲取到了單例實例并返回,線程B獲取了在線程A中初始化的單例。大體是這么回事。
由于我的項目中提及到JVM,所以給我出了一個場景題,垃圾會收器中,標記清除多次后,由于采用的是標記清除算法,那么你覺得可能會出現什么問題?
答:然后我說由于產生了內存碎片,所以當分配一個大對象的時候,由于內存不連續,那么會產生full GC;
這里提及到了full gc,問我,哪些情況會產生full GC,哪些情況產生minor GC?
答:minor會產生在eden區滿了,fullGC產生在老年代的剩余空間不足,以及永久代內存不足也會發生fullGC。
除了你項目中的內存溢出問題,你還知道哪些關于內存溢出內存泄漏的?
答:這里之前了解過ThreadLocal,我說,ThreadLocal中的鍵值對中的鍵是一個弱引用,那么在內存回收的時候,這個鍵很可能會被回收掉,然后鍵沒了,就無法找到value的值,造成了內存泄漏;
然后給我出了一個動態規劃的手寫代碼題,說來寫個代碼吧,大體是在n*m的矩陣方格中,找一個最大的正方形是幾乘幾的,有點忘了,
答:由于沒有準備過動態規劃的題目,這個題目看到我只說了暴力解決的方法,然后面試官提示讓我用動態規劃做,我想了半天沒想出來。。。。當時感覺應該是涼了。。。
時間差不多的時候,面試官說,就到這里吧,然后讓我出去等通知,果然通知我今天面試結束了,整整一個下午,特別特別累,前兩面結束的時候感覺特別穩,沒想到最后還是因為手寫代碼這一塊不會動態規劃掛掉了,當時感覺心態有點崩。。。
歡迎工作一到五年的java工程師朋友們加入Java填坑之路:860113481
群內提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!



回復

使用道具 舉報