引言
找學(xué)姐內(nèi)推的美團后臺開發(fā)崗位。剛投兩天就收到了面試通知党觅,相當(dāng)猝不及防雌澄。本文主要是記錄一些面試題目,面試題相關(guān)的知識在網(wǎng)上大多都查得到杯瞻,我就寫得稍微簡略一點镐牺。凡是文中用引號(“”)標(biāo)記的文字都是我當(dāng)時的回答,其他內(nèi)容則是我的一些補充魁莉。
面試官形象
一面:視頻面試睬涧,在牛客網(wǎng)的一個非常專業(yè)的面試平臺上旗唁,旁邊就有代碼框可以寫代碼給面試官看畦浓。男面試官,問的問題都偏java與計算機基礎(chǔ)(基礎(chǔ)是相對于項目而言)检疫,不像阿里上來就聊好久項目讶请,然后才問一些知識,美團則是上來先問基礎(chǔ)知識 屎媳,問了好久基礎(chǔ)知識才講一點項目夺溢。
一面
總體感覺
問得挺細,不過大多數(shù)問題都是挺經(jīng)典的烛谊,提前復(fù)習(xí)復(fù)習(xí)基本都能復(fù)習(xí)到风响。
1.自我介紹
自我介紹結(jié)束之后,面試官說那就先從你簡歷里寫的專業(yè)技能問起吧(我簡歷中專業(yè)技能第一項寫的是熟悉Java丹禀,然后他就先從java問起)状勤。
2.說說你在實習(xí)過程中干了什么?
3.ConcurrentMap相比以前的Map有哪些改進湃崩?
答:“CocurrentMap采用了分段式鎖荧降,以前的Map都是由Entry鏈表組成,而ConcurrentMap先將Entry分成一個個Segment攒读,然后再由Segment組成Map朵诫,每次寫的時候就只需要鎖住一個Segment就可以了,因此提高了性能薄扁〖舴担”
4.HashMap有哪些缺點废累?
答:“線程不安全”
5.你說HashMap是線程不安全的,那么有哪些情況會造成問題呢脱盲?
答:“當(dāng)兩個線程同時對HashMap進行ReSize的時候可能會產(chǎn)生環(huán)鏈邑滨。”
6.Java中會發(fā)生內(nèi)存溢出嗎钱反?
答:“會發(fā)生掖看。如果某個Java對象一直被保存在集合中忘記清除,就會導(dǎo)致引用一直不被釋放面哥,產(chǎn)生內(nèi)存溢出哎壳。記得Java中有一個WeakHashMap,能夠保存對象的弱引用尚卫,這樣程序中不再使用對象之后归榕,也會在Map中被自動清除≈ㄉ妫”
7.如果發(fā)現(xiàn)Java程序的CPU負載特別高刹泄,你會用什么工具進行分析和調(diào)試呢?
答:“Jconsole或者Jvisualvm怎爵,還有l(wèi)inux中自帶的top命令特石。”
然后面試官接著追問:“l(fā)inux中好像有參數(shù)能夠查看線程的內(nèi)存占用疙咸,你知道是什么嗎县匠?”
我:“不知道∪雎郑”
后來去網(wǎng)上查了查:查看線程的內(nèi)存與CPU占用的命令是top -H
乞旦。ps xH
也能查看系統(tǒng)中所有的線程。
面試官接著問:“造成這種現(xiàn)象的原因可能是什么呢题山?”
我:“有可能是程序中有死循環(huán)兰粉,或者線程數(shù)過多《ネ”
8.Java的線程池有用過嗎玖姑?
我回答說“用過,比如SingleThreadExecutor,CachedThreadPool,FixedThreadPool等等慨菱⊙媛纾”
面試官:這都是一些工廠方法,他們實際生產(chǎn)的是什么對象以及這個類的構(gòu)造方法的參數(shù)有了解嗎符喝?
我:“不了解闪彼。”
后來去網(wǎng)上查了一查:
其實Executors工廠中生成的這些線程池最終都是用不同的參數(shù)構(gòu)造了ThreadPoolExecutor對象,ThreadPoolExecutor類的構(gòu)造方法中有corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory和handler這幾個參數(shù)畏腕,含義如下:
- corePoolSize:核心池的大小缴川。在創(chuàng)建了線程池后,默認(rèn)情況下描馅,線程池中并沒有任何線程把夸,而是等待有任務(wù)到來才創(chuàng)建線程去執(zhí)行任務(wù),除非調(diào)用了prestartAllCoreThreads()或者prestartCoreThread()方法铭污,從這2個方法的名字就可以看出恋日,是預(yù)創(chuàng)建線程的意思,即在沒有任務(wù)到來之前就創(chuàng)建corePoolSize個線程或者一個線程嘹狞。默認(rèn)情況下谚鄙,在創(chuàng)建了線程池后,線程池中的線程數(shù)為0刁绒,當(dāng)有任務(wù)來之后,就會創(chuàng)建一個線程去執(zhí)行任務(wù)烤黍;
- maximumPoolSize:線程池最大線程數(shù)知市,它表示在線程池中最多能創(chuàng)建多少個線程;
- keepAliveTime:表示線程沒有任務(wù)執(zhí)行時最多保持多久時間會終止速蕊。默認(rèn)情況下嫂丙,只有當(dāng)線程池中的線程數(shù)大于corePoolSize時,keepAliveTime才會起作用规哲,直到線程池中的線程數(shù)不大于corePoolSize跟啤,即當(dāng)線程池中的線程數(shù)大于corePoolSize時,如果一個線程空閑的時間達到keepAliveTime唉锌,則會終止隅肥,直到線程池中的線程數(shù)不超過corePoolSize。但是如果調(diào)用了allowCoreThreadTimeOut(boolean)方法袄简,在線程池中的線程數(shù)不大于corePoolSize時腥放,keepAliveTime參數(shù)也會起作用,直到線程池中的線程數(shù)為0绿语;
- unit:參數(shù)keepAliveTime的時間單位
- workQueue:一個阻塞隊列秃症,用來存儲等待執(zhí)行的任務(wù);
- threadFactory:線程工廠吕粹,主要用來創(chuàng)建線程种柑;
- handler:表示當(dāng)拒絕處理任務(wù)時的策略,有以下四種取值:
1.ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常匹耕。
2.ThreadPoolExecutor.DiscardPolicy:也是丟棄任務(wù)聚请,但是不拋出異常。
3.ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務(wù)泌神,然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程)
4.ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務(wù)
9.說說看Java的堆空間是怎么分配的良漱?
答:“分為新生代舞虱,老年代與永久代∧甘校”
10.JVM的那些啟動參數(shù)有了解過嗎矾兜?-Xms是代表什么呢?JVM的最大堆內(nèi)存與最小堆內(nèi)存容量默認(rèn)是一樣的患久,這是為什么呢椅寺?
答:“了解過,但是參數(shù)名稱我都忘了蒋失》蹬粒”
后來去網(wǎng)上查了一查:
-Xms參數(shù)用來配置初始堆,-Xmx用來配置最大堆篙挽,它們的默認(rèn)值都是3550M荆萤,之所以將他們設(shè)置為一樣是為了避免每次垃圾回收完之后JVM都重新分配一次內(nèi)存。
9.新生代內(nèi)部的空間是怎么分配的铣卡?Eden Space占百分之多少链韭?
答:“分為Eden Space與Survivor Space。Eden Space占了百分之八十煮落〕ㄇ停”
11.新生代的垃圾回收和老年代的垃圾回收有什么區(qū)別?
答:“一個叫Minor GC蝉仇,一個叫Major GC旋讹。用的算法不同,一個用的是“復(fù)制算法”轿衔,一個用的是“標(biāo)記整理”算法沉迹。”
12.寫個單例模式給我看看害驹?
然后我就默寫了標(biāo)準(zhǔn)的懶漢模式的單例模式代碼胚股,加了雙重鎖定。
13.說說看你了解哪些git命令裙秋?git rebase了解嗎琅拌?
答:“比如git clone,git pull摘刑,git push进宝。不知道git rebase〖纤。”
后來去網(wǎng)上查了查:git rebase其實就是一個用于分支合并的命令党晋,以前我通常都用git merge來合并分支,其實git rebase相比git merge更能夠保持工作樹的整潔。
14.maven的依賴加載順序是什么未玻?
我說“我只是會用maven灾而,原理不清楚“饨耍”
之后去網(wǎng)上查了一查:
查了之后才突然明白過來旁趟,面試官并沒想刁難我,只是我當(dāng)時沒有弄清題意庇绽,只要像下面那樣簡單地回答就可以了:
1. 先在本地倉庫中搜索;
2. 如果在本地倉庫中沒有搜索到的話锡搜,maven會去中央倉庫中搜索,如果搜索到則將其下載到本地倉庫留以后使用瞧掺;如果沒有搜索到的話耕餐,則maven會看一看在pom中有沒有聲明遠程倉庫(遠程倉庫是指用戶自定義倉庫),如果沒有聲明則報錯辟狈;否則的話進行下一步肠缔;
3. 在遠程倉庫中搜索依賴,如果搜索到的話則下載到本地供以后使用哼转,否則報錯桩砰;
15.寫個sql看看,查詢student表中分?jǐn)?shù)大于80的學(xué)生
見我的另一篇博客:積累一些常見的寫SQL的題释簿,其中的第一題。
16.再寫個sql硼莽,查詢student表中分?jǐn)?shù)排名第二的學(xué)生庶溶,最好能考慮學(xué)生考試成績并列的情況。
見我的另一篇博客:積累一些常見的寫SQL的題懂鸵,其中的第二題偏螺。
17.來寫個linux命令吧,某個文件的內(nèi)容在不停地更新匆光,我要實時查看更新的內(nèi)容中包含"北京"字段的行
答:"tail -F | grep 北京"
18.來寫個算法的代碼套像,就二分查找吧
19.你寫的二分查找代碼是不是沒有考慮重復(fù)的數(shù)字,如果有重復(fù)的數(shù)字怎么辦终息?
答:“沒有考慮夺巩,不知道怎么辦≈苷福”
20.講講看你從瀏覽器中輸入網(wǎng)址到看到網(wǎng)頁之間發(fā)生了什么柳譬?
答:“網(wǎng)址先經(jīng)過DNS解析變成IP地址,然后瀏覽器向服務(wù)器發(fā)起HTTP請求续镇,請求回網(wǎng)頁然后渲染到了瀏覽器上美澳。”
注:感覺我這里答得太粗略了,大家可以去網(wǎng)上看看更詳細的解答制跟。
21.講講你在項目中遇到的困難是怎么解決的舅桩?
這個問題在各種面試中都會經(jīng)常遇到,建議大家好好回顧一下之前做過的項目雨膨,將其中的一些比較上檔次(就是比較不會讓人覺得low)的困難整理出來擂涛,想想看如何能將其描述得繪聲繪色,如果沒有什么比較上檔次的困難的話哥放,可以考慮
22.為什么用Redis而不直接存在java對象中呢歼指?
答:“感覺用數(shù)據(jù)庫更加可靠一點吧∩瘢”
23.你以前實習(xí)的時候有沒有遇到什么困難踩身?你是怎么解決的?
24.看你簡歷里寫Hadoop社露,Mapreduce這些東西實際中有使用過嗎挟阻?還是說只是學(xué)學(xué)了相關(guān)知識
我說“我只是學(xué)了學(xué)相關(guān)知識∏偷埽”
25.Hadoop附鸽,Mapreduce在什么場景下使用呢?
答:“在企業(yè)大數(shù)據(jù)處理的時候使用”
26.假如有一個很大的文件里面全是數(shù)字瞒瘸,你要對其進行排序坷备,你要怎么做呢?提示你可以借鑒mapreduce的思想
當(dāng)時隨口說了一個方案情臭,感覺也不太對:“先分塊快排省撑,然后再進行歸并排序”。
27.Zookeeper有哪些應(yīng)用場景呢俯在?
答:“集中管理配置文件竟秫,或者分布式鎖□卫郑”
28.假如讓你實現(xiàn)一個可以遞增的id肥败,你要怎么實現(xiàn)?
我說“可以使用數(shù)據(jù)庫事先生成好”愕提,然后面試官說如果不用數(shù)據(jù)庫呢馒稍?我回答說“可以用Redis解決”,面試官又問:Zookeeper可以實現(xiàn)嗎浅侨?我說“不知道筷黔,沒有用Zookeeper搞過≌叹保”佛舱,面試官說:可以用Zookeeper實現(xiàn)的(后來我去網(wǎng)上搜了一下椎例,確實是Zookeeper很經(jīng)典的用法)
29.還有什么問題想問我的?
答:“暫時沒有”
這個地方建議大家還是問一下请祖,比如向他請教一下之前他問的問題的答案订歪,可能這樣會給面試官留下更好的印象。
30.你能實習(xí)多久肆捕?一周能來幾天
答:“我能實習(xí)將近一年刷晋,一周能來5天”
31.一周能來五天?你們不用上課嗎慎陵?
答:“有課眼虱,下學(xué)期沒課∠Γ”
面試官說:“那你是到暑假才能來了捏悬?”
我說“是的∪筇荩”