美團面試經驗分享
本文面試題是轉載於:程式設計師喬戈裡,因為作者只是描述面試問題的過程,我這裡對面試問題做詳細補充。
一面
1、自我介紹
答:自我介紹是面試中唯一的自己主動介紹自己的環節,一定要好好把握好,你資料結構學的好的話可以手撕一個紅黑樹。你就說我資料結構掌握地很好,反正就是要把自己的優勢凸顯出來,然後最末尾會加上自己熟悉java,然後面試官就會問java的一些東西;
2、專案介紹及其亮點
答:開始吹牛逼。。。專案中的亮點,用到的新技術(前提是必須自己能回答出一些東西的技術);
3、Java的8種資料型別有哪些?
答:int,short,long,float,double,byte,boolean,char;
3、問了Integer快取資料的範圍?
答:-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有什麼區別?
答:wait 的話會釋放物件鎖,sleep 的話不會釋放的物件鎖。
7、由於還提及了hashcode,面試官接著問我,hashcode用在哪裡?
答:這個我不假思索地說,hashmap和ConcurrentMap,這裡我猜面試官肯定要繼續問我這兩個東西了。
8、果不其然,面試官說,講一講hashmap?
答:hashmap我講了hashmap的資料結構陣列連結串列結構,講了hashmap的put,get,擴容的底層原理,同時講了hashmap在1.7與1.8中的區別,put中引入了紅黑樹,以及擴容的時候不同,這些就講了挺長時間,最後我說了一句hashmap不是執行緒安全的。詳情參考博文:
9、這裡提及了hashMap是非執行緒安全的,面試問我為啥不是執行緒安全的,舉幾個例子?
答:我說了,在擴容的時候hashmap會可能產生環,造成死迴圈;hashmap在插入新的階段的時候,多個執行緒同時插入,會把除了最後的那個執行緒的其它執行緒插入的結點丟失;對於修改的時候,多個執行緒修改,對只保留最後的一個執行緒的修改結果;擴容的時候,會只保留最後一個執行緒的擴容後的那個陣列;從擴容修改增加說了一遍;
10、我本以為要接著問ConCurrentMap,額,出乎我的意料,並沒有問,可能覺得我hashmap準備的很充分,然後接著問了我JVM瞭解嗎?
答:我說了解;
11、讓我說意思JVM的分為哪幾塊?
答:方法區,虛擬機器棧,本地方法棧,堆,程式計數器,然後我就自己沒等面試官問新的問題,繼續接著說,方法區和堆是執行緒共享的,虛擬機器棧本地方法棧和程式計數器是執行緒私有的,除了程式技術器不會發生記憶體溢位,其它都會發生記憶體溢位,並說了哪些會發生堆溢位哪些會發生棧溢位;這裡就是大家要學會自己吧啦吧啦地說一堆,因為據我觀察每個面試官面試每個是有一個固定時間的,超過這個時間段就結束了,所以只要面試官不打斷你,你就一頓說;
12、由於提及到了記憶體溢位,面試官問我記憶體溢位和記憶體洩漏的區別?
答:記憶體洩露我說就是一塊申請了一塊記憶體以後,無法去釋放掉這塊記憶體,丟失了這段記憶體的引用;記憶體溢位就是申請的記憶體不夠,撐不起我們需要的記憶體;
13、這裡問完我就去問了資料庫,4大特性是啥,舉個例子?
答:原子性,我說就是一個事務要麼全部完成,要麼全部失敗,要麼做要麼不做;一致性,比如a+b=100,一個事務改變了a比如增加了a的值,那麼必須同時改變b,保證在事務結束以後a+b=100依然成立,這就是一致性;永續性,額就是修改完以後,在資料庫中生效是永久的;隔離性,我就是說對於A對B進行轉賬,A沒把這個交易完成的時候,B是不知道A要給他轉錢。
14、資料的隔離級別有啥,每個隔離級別舉個例子?
答:額,(怎麼都要舉例子啊,啊啊啊啊~),內心波瀾,臉上面無表情地說:1.未提交讀,事務中發生了修改,即使沒有提交,其它事務也是可見的,舉例子我就說對於一個數A原來50修改為100,但是我還沒有提交修改,另一個事務看到這個修改,而這個時候原事務發生了回滾,這時候A還是50,但是另一個事務看到的A是100,這就是未提交讀;2.提交讀,就是說,對於一個事務從開始直到提交之前,所做的任何修改是其它事務不可見的,舉例就是對於一個數A原來是50,然後提交修改成100,這個時候另一個事務在A提交修改之前,讀取到了A是50,剛讀取完,A就被修改成100了,這個時候另一個事務再進行讀取發現A就突然變成100了;3.可重複讀;可重複讀,就是對於一個記錄讀取多次的記錄是相同的,舉例就是對於一個數A讀取的話一直是A,前後兩次讀取到的A是一致的;可序列化讀,就是說在併發情況下,和序列化的讀取的結果是一致的,沒有什麼不同,這個舉例我就說,不會發生髒讀和幻讀;然後資料庫這一塊就過去了。
15、接著問我計算機網路,問了我7層有哪7層?
答:物理層,資料鏈路層,網路層,傳輸層,會話層,表示層,應用層;
16、接著問了我TCP在哪層,UDP在哪層,HTTP在哪層?
答:TPC和UDP在傳輸層,然後HTTP問我在哪個層,我一下有點忘了,這個沒答上來,會去看了是在應用層。
17、問到這裡就結束了,然後面試官問我有啥想問的,我就問如何評價我的面試表現?
答:因為一面都是問基礎的知識,面試官和我說,我感覺你基礎很紮實,他直接和我說我這裡的話是通過的,不知道後面的面試官怎麼問你,然後我說了聲謝謝,就去酒店的一個會議廳等待二面;
二面
1、自我介紹
2、專案介紹,及其亮點介紹。
答:繼續吹牛逼。
3、然後問了我集合瞭解嗎,讓我說話ArrayList和LinkedList的區別?
答:ArrayList底層是陣列,LinkedList底層是連結串列,ArrayLIst查詢資料快,LinkedList插入刪除快;
4、繼續問我linkedList可以用for迴圈遍歷嗎?
答;能不用盡量不要用,linkedList底層是連結串列,它使用for進行遍歷,訪問每一個元素都是從頭開始訪問然後直到找到這個元素,比如說找第三個節點,需要先找到第一個節點然後找到第二個節點;繼續找第4個節點,不是從第三個節點開始找的,還是從第一個節點開始,所以非常的慢,不推薦,可以用迭代器進行遍歷。
5、介紹一下ConCurrenthashmap
答:我感覺是因為一面問了hashmap,所以二面面試官可能是看見了面試記錄,額,這塊我非常熟,這個我又講了很長時間,講了ConCurrentHashMap的底層的分段鎖的結構,講了ConCurrentHashmap的get原始碼,get原始碼是沒有使用鎖的,這裡我把get原始碼背寫了下來,並給面試官講了get原始碼在插入修改刪除的多執行緒下是安全的;然後講了put操作,remove,擴容操作,然後講了在1.7和1.8的區別,引入了紅黑樹,連結串列長度大於8轉換成紅黑樹,採用了CAS+synchronized來保證併發安全,吧啦吧啦又講了挺長時間;
6、來看看這道題,說著拿出來一個小紙條
答:這個紙條感覺每個面試官都是隻有紙條,所以儘可能地和周圍的同學多交流,有一定的肯可能他的面試官就你的面試官。題目:讓我自己手算a,b,c,d的值。
結果是a = 8b=5,c=7,d=35.計算完我問他對不對,他沒勒我。。。
7、然後問我單利模式瞭解不,寫一個單例模式?
答:這個之前準備過,我寫了一個雙重鎖的單例模式。
8、接著問了我虛擬機器瞭解嗎,介紹一些虛擬機器的記憶體模型?
答:這個之前也準備過,這裡要注意了,虛擬機器的記憶體模型和執行時的資料區域不是一回事;虛擬機器記憶體模型又叫JMM,就是每個執行緒有自己的工作記憶體,然後又一個主記憶體,執行緒工作的時候都是在自己的工作記憶體中拷貝一個主記憶體的副本;還說了JMM的happens before原則,程式順序原則,鎖原則,執行緒中斷原則,傳遞性原則,還有其他的沒想起來就沒說了。
9、介紹一些你瞭解的垃圾回收演算法?
10、問到這裡,問了我你知道SurvivorRatio這個引數為啥初始是預設的8:1:1嗎?
答:這個由於剛才剛問了垃圾回收演算法,我覺得可能有關聯,於是我說,方便複製演算法操作,Eden區域大多數都是朝生夕死的,這個比例,可以方便複製演算法的中from和to來回進行復制存活的物件,額,說完,他沒有說啥,感覺是默許了吧;
11、突然又問,二叉樹瞭解嗎,寫一個二叉樹的深度搜索遍歷?
答:當時我聽到中道題,有點懵,什麼是二叉樹的深度搜索遍歷,我只知道層次遍歷,前序後序中序遍歷啊,我想了想,感覺和後序遍歷挺像的,我覺得應該就是後序遍歷吧,我就先寫了個後序遍歷的遞迴寫法。
然後他看了一眼,沒說啥,感覺這個面試官有點話少冷淡,全程不和我互動,emmmm....下來自己百度了下,對的。。。
這個程式碼問完我,讓後讓我去等通知,我感覺回答的還行,果然沒過幾分鐘,通知我去三面;
三面
1、照例自我介紹和專案介紹;
2、上來就讓我手撕一個單例模式。。。
答:繼續寫我的雙重鎖模式
3、讓我講了講程式碼是啥啥意思?
答:STEP 1. 執行緒A訪問getInstance()方法,因為單例還沒有例項化,所以進入了鎖定塊。STEP 2. 執行緒B訪問getInstance()方法,因為單例還沒有例項化,得以訪問接下來程式碼塊,而接下來程式碼塊已經被執行緒1鎖定。STEP 3. 執行緒A進入下一判斷,因為單例還沒有例項化,所以進行單例例項化,成功例項化後退出程式碼塊,解除鎖定。STEP 4. 執行緒B進入接下來程式碼塊,鎖定執行緒,進入下一判斷,因為已經例項化,退出程式碼塊,解除鎖定。STEP 5. 執行緒A初始化並獲取到了單例例項並返回,執行緒B獲取了線上程A中初始化的單例。大體是這麼回事。
4、由於我的專案中提及到JVM,所以給我出了一個場景題,垃圾會收器中,標記清除多次後,由於採用的是標記清除演算法,那麼你覺得可能會出現什麼問題?
答:然後我說由於產生了記憶體碎片,所以當分配一個大物件的時候,由於記憶體不連續,那麼會產生full GC。
5、這裡提及到了full gc,問我,哪些情況會產生full GC,哪些情況產生minor GC?
答:minor會產生在eden區滿了,fullGC產生在老年代的剩餘空間不足,以及永久代記憶體不足也會發生fullGC。
6、除了你專案中的記憶體溢位問題,你還知道哪些關於記憶體溢位記憶體洩漏的?
答:這裡之前瞭解過ThreadLocal,我說,ThreadLocal中的鍵值對中的鍵是一個弱引用,那麼在記憶體回收的時候,這個鍵很可能會被回收掉,然後鍵沒了,就無法找到value的值,造成了記憶體洩漏;
7、然後給我出了一個動態規劃的手寫程式碼題,說來寫個程式碼吧,大體是在n*m的矩陣方格中,找一個最大的正方形是幾乘幾的,有點忘了。
答:
該博文持續更新中......
如有披露或問題歡迎留言或者入群探討