<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          字節(jié)、美團(tuán)、快手核心部門面試總結(jié)(真題解析)

          共 6111字,需瀏覽 13分鐘

           ·

          2020-11-14 21:42


          前言


          由于個人發(fā)展的原因,前段時間又出去面試了,這次面試目標(biāo)比較清晰,主要面一些業(yè)務(wù)量比較大、業(yè)務(wù)比較核心的部門。


          前前后后面了一個多月,面了不少公司,面試輪次二三十輪應(yīng)該是有的。


          按照自己的習(xí)慣,將這次面試過程中的一些經(jīng)驗(yàn)總結(jié)、心得體會記錄下來,自己留個記錄,也希望可以幫助到一些同學(xué)。


          個人情況


          幾個關(guān)鍵詞:Java后端、5年經(jīng)驗(yàn)、普通本科、面試時在阿里。



          面試情況


          B站、愛奇藝:投了簡歷沒下文,扎心了

          字節(jié):3輪技術(shù) + hr,offer

          快手:4輪技術(shù) + hr,offer

          美團(tuán):3~5輪技術(shù) + hr ,3個部門offer(可并行面多部門)

          途虎:3輪技術(shù) + hr + CTO,offer

          得物:1面通過,2面需要去現(xiàn)場(上海),放棄

          貝殼:1面通過,2面面試官表示業(yè)務(wù)并發(fā)量不大,放棄

          猿輔導(dǎo):hr表示只能在19點(diǎn)之前面試,19點(diǎn)后已經(jīng)下班(過分了),放棄



          真題:Java 基礎(chǔ)


          常見八股文


          Java 常見的八股文題目這次感覺問的不是很多(其實(shí)是我忘了問了哪些題),而且考來考去就那些題,可以參考:《4 年 Java 經(jīng)驗(yàn)面試總結(jié)、心得體會》里面的題目即可。


          比較常問的幾個知識點(diǎn)之前已經(jīng)專門出過面試解析:《面試阿里,HashMap 這一篇就夠了》、《面試必問的線程池,你懂了嗎?》、《BATJTMD 面試必問的 MySQL,你懂了嗎?


          近期也在開始準(zhǔn)備剩余部分的面試題解析,redis 和 spring+mybatis 已經(jīng)在路上,有興趣的可以關(guān)注一波,不過首先還是優(yōu)先保證質(zhì)量,所以可能效率不會那么高。


          這邊列舉幾個我印象比較深的題目。



          ConcurrentHashMap的并發(fā)擴(kuò)容


          ConcurrentHashMap 在擴(kuò)容時會計(jì)算出一個步長(stride),最小值是16,然后給當(dāng)前擴(kuò)容線程分配“一個步長”的節(jié)點(diǎn)數(shù),例如16個,讓該線程去16個節(jié)點(diǎn)進(jìn)行擴(kuò)容操作(節(jié)點(diǎn)從老表移動到新表)。


          如果在擴(kuò)容結(jié)束前又來一個線程,則也會給該線程分配一個步長的節(jié)點(diǎn)數(shù)讓該線程去擴(kuò)容。依次類推,以達(dá)到多線程并發(fā)擴(kuò)容的效果。



          AQS中有多個線程并發(fā)添加到隊(duì)列中,需要做并發(fā)控制嗎


          這個是需要的,源碼中是通過 CAS 來進(jìn)行并發(fā)控制。


          在?addWaiter(Node mode)?方法中,如果并發(fā)添加節(jié)點(diǎn),則只會有一個線程成功,另一個會失敗,從而走到?enq(node)?方法中去進(jìn)行重試。


          說實(shí)話,雖然看過源碼,但是真的很難記得這么多細(xì)節(jié),因?yàn)?Java 面試要準(zhǔn)備的東西實(shí)在太多了,所以這邊可以利用一個小技巧。


          小技巧:首先并發(fā)控制肯定是要做的,這個不難推測;接著,如果注意觀察的話,不難發(fā)現(xiàn)在 JDK 源碼中做并發(fā)控制的方式大多是 CAS,所以當(dāng)你不知道怎么做并發(fā)控制的時候,可以直接蒙個 CAS,很有可能就被你蒙對了。




          線程池有多個線程同時沒取到任務(wù),會全部回收嗎


          這個題不是很好理解,舉個例子:線程池核心線程數(shù)是5,當(dāng)前工作線程數(shù)為6(6>5,意味著當(dāng)前可以觸發(fā)線程回收),如果此時有3個線程同時超時沒有獲取到任務(wù),這3個線程會都被回收銷毀嗎。


          也是非常刁鉆的一題,非常細(xì)節(jié)。但是即使我們記不得源碼的細(xì)節(jié)了,還是有辦法去推敲出來的。


          思路:這道題的核心點(diǎn)在于有多個線程同時超時獲取不到任務(wù)。正常情況下,此時會觸發(fā)線程回收的流程。


          但是我們知道,正常不設(shè)置 allowCoreThreadTimeOut 變量時,線程池即使沒有任務(wù)處理,也會保持核心線程數(shù)的線程。


          如果這邊3個線程被全部回收,那此時線程數(shù)就變成了3個,不符合核心線程數(shù)5個,所以這邊我們可以首先得出答案:不會被全部回收。這個時候面試官肯定會問為什么?


          根據(jù)答案不難推測,為了防止本題的這種并發(fā)回收問題的出現(xiàn),線程回收的流程必然會有并發(fā)控制。


          what?又是并發(fā)控制,那不是又可以用到上面剛講的“小技巧”?沒錯,源碼中確實(shí)又是使用 CAS 來進(jìn)行并發(fā)控制,從而保證在本例中只會有一個線程成功被回收。


          本例相關(guān)源碼在:getTask()?方法中。



          多個AOP的順序怎么定


          通過 Ordered 和 PriorityOrdered 接口進(jìn)行排序。


          思路:這個問題其實(shí)我也也沒準(zhǔn)備過,但是我知道在 Spring 中有專門定義了 Ordered 和 PriorityOrdered 接口來實(shí)現(xiàn)排序功能,例如:對 BeanFactoryPostProcessor 的排序就是使用的這兩個接口,所以這邊我是直接猜測的用的這兩個接口,結(jié)果還真是,所以平時多積累還是挺重要的



          Object的wait()方法為什么需要先獲取鎖


          這個問題說難也難,說簡單也簡單。


          說簡單是因?yàn)椋蠹覒?yīng)該都記得有道題目:“sleep和wait的區(qū)別”,答案中有一項(xiàng)就是:“wait會釋放對象鎖,sleep不會”,既然要釋放鎖,那必然要先獲取鎖。


          說難是因?yàn)槿绻麤]有聯(lián)想到這個題目并且沒有了解 wait() 的底層原理,可能就完全沒頭緒了。


          在 JVM 源碼中,wait() 的底層邏輯會釋放當(dāng)前占有的鎖,在釋放前會進(jìn)行鎖的檢查,如果當(dāng)前線程沒有持有鎖,則會直接拋出 IllegalMonitorStateException。



          synchronize底層維護(hù)了幾個列表存放被阻塞的線程


          這題是緊接著上一題的,很明顯面試官想看看我是不是真的對 synchronize 底層原理有所了解。


          synchronize 底層使用了3個雙向鏈表來存放被阻塞的線程,3個雙向鏈表分別是:_cxq(Contention queue)、_EntryList(EntryList)、_WaitSet(WaitSet)


          當(dāng)線程獲取鎖失敗進(jìn)入阻塞后,首先會被加入到?_cxq 鏈表,_cxq 鏈表的節(jié)點(diǎn)會被進(jìn)一步轉(zhuǎn)移到?_EntryList 鏈表。


          當(dāng)持有鎖的線程釋放鎖后,_EntryList 鏈表頭結(jié)點(diǎn)的線程會被喚醒,該線程稱為 OnDeck 線程,然后該線程會嘗試搶占鎖。


          而當(dāng)我們調(diào)用 wait() 時,線程會被放入?_WaitSet,直到調(diào)用了 notify()/notifyAll()?后,線程才被重新放入?_cxq 或?_EntryList,默認(rèn)放入?_cxq 鏈表頭部。



          真題:算法題、手寫代碼


          單鏈表反轉(zhuǎn)、合并兩個有序鏈表、版本號比較


          送分題,出這種題說明你前面面的不錯,筆試題只是走個過場,力扣原題:21、165、206。


          多線程按順序輸出ABC若干次


          思路:考察多線程基礎(chǔ),Semaphore、Lock + Condition、synchronize 都有解法。



          單例模式


          手寫單例模式,加上以前幾次的面試,我有印象的至少有兩個大廠問過了,還是挺重要的。通常有五種:懶漢、餓漢、雙重檢測、靜態(tài)內(nèi)部類、枚舉,參考之前的文章:《單例模式詳解



          手寫阻塞隊(duì)列


          參考 ArrayBlockingQueue,實(shí)現(xiàn) put 和 take 方法即可。



          手寫HashMap


          JDK 1.8 的版本有點(diǎn)太復(fù)雜了,可以寫 JDK 1.7 的版本,使用鏈表 + 數(shù)組實(shí)現(xiàn),實(shí)現(xiàn) get 和 put 方法即可。



          輸出一個二叉樹的寬度


          思路二叉樹的層序遍歷(力扣102)的簡單變形,記錄下每層的節(jié)點(diǎn)個數(shù),取最大值即可。



          阿拉伯?dāng)?shù)字轉(zhuǎn)漢字


          例如:輸入123.123,輸出一百二十三點(diǎn)一二三。


          思路:將“零一二三四五六七八九”、“十百千萬億”這些結(jié)果用到的字符存到數(shù)組,然后將阿拉伯?dāng)?shù)字轉(zhuǎn)字符串,遍歷拼接結(jié)果。


          我當(dāng)時的思路是將整數(shù)部分和小數(shù)部分分開處理,小數(shù)部分比較容易,主要是整數(shù)部分比較難處理,整數(shù)部分我當(dāng)時第一想法是從低位往高位遍歷,然后按每一位拼接,例如123,則拼出:三、二十、一百,最終組成:一百二十三。


          這題思路不難想,方法應(yīng)該有很多種,但是要能通過測試用例還是挺難的,很多細(xì)節(jié)需要處理,需要反復(fù)調(diào)試。



          有序列表,找出所有兩數(shù)之和為10000的組合


          思路:可以用 HashMap 來存遍歷過的數(shù)字,每次遍歷時檢查下 HashMap 里是否有目標(biāo)數(shù)字,時間復(fù)雜度O(n),空間復(fù)雜度為O(n)。


          如果面試官要求空間復(fù)雜度更優(yōu)的解法,則可以用雙指針,從列表的兩邊向中間掃,和小于10000,則左指針右移,和大于10000,則右指針左移,雙指針理論上沒有使用額外的空間。



          單鏈表奇數(shù)節(jié)點(diǎn)移動到最前面


          輸入:a1->a2->a3->a4->a5

          輸出:a1->a3->a5->a2->a4


          思路:也是硬寫,不過這題還是有點(diǎn)規(guī)律的,只移動奇數(shù)節(jié)點(diǎn),相當(dāng)于移動一個,跳過一個,移動一個,跳過一個。



          字符串的全排列


          輸入:s = "abc"

          輸出:["abc","acb","bac","bca","cab","cba"]

          思路:回溯法,按順序固定每一位,同時排除同一位出現(xiàn)重復(fù)的情況,劍指 Offer 38 題。



          最長上升子序列


          輸入: [10,9,2,5,3,7,101,18]

          輸出: 4 ,最長的上升子序列是?[2,3,7,101],它的長度是 4


          思路:動態(tài)規(guī)劃,力扣 300 題。



          真題:項(xiàng)目、架構(gòu)、管理


          項(xiàng)目介紹


          必問的題目,項(xiàng)目介紹主要有兩個重點(diǎn):


          1、要讓面試官知道你在做什么。可以從項(xiàng)目的背景開始,為什么要做這個項(xiàng)目,按項(xiàng)目的演進(jìn)過程、分階段介紹。


          2、突出項(xiàng)目的亮點(diǎn)和關(guān)鍵技術(shù)。面試官畢竟只是在聽一個他沒接觸過的項(xiàng)目,所以他會更容易去抓取候選人介紹中的一些感興趣的“關(guān)鍵詞語”來提問,例如:從0到1、技術(shù)選型、性能優(yōu)化、表達(dá)式引擎、規(guī)則引擎、平臺化、技術(shù)重構(gòu)、架構(gòu)升級等等。


          當(dāng)然,你如果提到這些詞,就要做好被追問的準(zhǔn)備。



          技術(shù)選型


          技術(shù)選型主要比較幾個維度:性能、穩(wěn)定性、接入成本、社區(qū)活躍度、業(yè)務(wù)擴(kuò)展性、業(yè)務(wù)特點(diǎn)等等,沒有所謂最好的框架/工具,只有最合適自己的。


          這邊拿表達(dá)式引擎來作為例子:


          我自己選用的是 Aviator,首先我會介紹 Aviator 的基本特點(diǎn),然后跟 IKExpression、Groovy 進(jìn)行對比,重點(diǎn)突出 Aviator 的優(yōu)點(diǎn):高性能、輕量級,并且強(qiáng)調(diào) Aviator 已經(jīng)足夠滿足業(yè)務(wù)需求,同時其作者在阿里方便進(jìn)行交流等等。



          做過最牛逼的功能


          我經(jīng)常看到有同學(xué)吐槽這個問題,但是這個問題說實(shí)話問的頻率非常高,所以面試前還是得好好準(zhǔn)備一下,爭取能讓面試官眼前一亮。此時不裝逼,更待何時。



          我這次講的是一個性能優(yōu)化的案例,將一個接口從性能提升了兩個量級,不看過程只看結(jié)果還是有點(diǎn)嚇人的。并且講完案例后,我通常會繼續(xù)分享一些自性能優(yōu)化方面的研究和積累。


          我們研究和積累的一些方案和技術(shù)可能并不適用于自己當(dāng)前工作的業(yè)務(wù)場景,但是這些積累可能是很牛逼的,所以這時候你自己要去主動分享出來,讓面試官看到你的亮點(diǎn)。



          DDD(領(lǐng)域驅(qū)動設(shè)計(jì))


          這個東西最近挺火的,老板們也對這個感興趣,因?yàn)榭雌饋硗Ω叽笊系模⑶易约阂苍诤啔v里面寫了,所以經(jīng)常被問,印象中應(yīng)該是這次面試被問的最多的。


          DDD不是一套框架,而是一種架構(gòu)思想,所以每個人都可以有自己的理解和實(shí)踐,只要你能講出你的理解,并且講出其優(yōu)點(diǎn)即可。


          可以圍繞設(shè)計(jì)思想、核心解決的問題、分層架構(gòu)、優(yōu)缺點(diǎn)、項(xiàng)目中的應(yīng)用去介紹。



          平臺化


          也是老板們比較感興趣的問題,這個東西就有點(diǎn)涉及到架構(gòu)方面的知識了。當(dāng)然,畢竟也5年經(jīng)驗(yàn)了,這方面的東西確實(shí)得有一些了解了。


          首先,介紹平臺化的業(yè)務(wù)背景,通常是在一個場景下存在不同的業(yè)務(wù)模式,兩者有區(qū)分,但是又有很多共性,所以這個時候去進(jìn)行平臺改造。


          同時強(qiáng)調(diào),在從業(yè)務(wù)模式從一個增加到兩個的時候,進(jìn)行平臺化改造是性價比最高的,后續(xù)有新的模式就可以直接復(fù)用了。


          平臺化的核心思想:抽取公用邏輯,根據(jù)業(yè)務(wù)的差異點(diǎn)提供自定義擴(kuò)展點(diǎn),不同業(yè)務(wù)模式通過自定義擴(kuò)展點(diǎn)實(shí)現(xiàn)自己的差異化邏輯,以達(dá)到抽象復(fù)用,提升新業(yè)務(wù)模式的開發(fā)效率。



          項(xiàng)目管理經(jīng)驗(yàn)(PM)


          5年經(jīng)驗(yàn)通常需要在項(xiàng)目或需求中去承擔(dān)起一個負(fù)責(zé)人的角色,所以項(xiàng)目管理也是面試官很喜歡考察的。


          總結(jié)來說,PM 的相關(guān)問題都是圍繞以下來展開:如何保障項(xiàng)目的按時交付,遇到突發(fā)問題時怎么應(yīng)對。


          PM 常見的職責(zé)如下:


          1)協(xié)調(diào)各端人員進(jìn)行需求評審。


          2)排期:協(xié)調(diào)好各端進(jìn)行排期評估,預(yù)留各端人員時間資源,做好總體排期、里程碑設(shè)定。


          3)約定項(xiàng)目溝通機(jī)制:根據(jù)項(xiàng)目判斷是否需要統(tǒng)一項(xiàng)目室開發(fā)、各端之間如何同步進(jìn)展及問題,如遇項(xiàng)目風(fēng)險,及時向PM反饋,PM可聯(lián)合討論,確定最終方案。


          4)把控項(xiàng)目進(jìn)度:及時了解各端的進(jìn)度,及時了解項(xiàng)目風(fēng)險(進(jìn)度緩慢、人員請假等),及時與產(chǎn)品和業(yè)務(wù)溝通協(xié)調(diào),及時作出風(fēng)險應(yīng)對。


          5)需求變更控制:項(xiàng)目立項(xiàng)后,所有的需求變更,不得在原需求文檔上進(jìn)行修改。如需修改,需要與PM溝通確認(rèn)。需求統(tǒng)一交給PM,由PM溝通后郵件通知項(xiàng)目組成員。


          6)質(zhì)量控制:接口提供者,在項(xiàng)目聯(lián)調(diào)前需要保證主體功能OK;各端在聯(lián)調(diào)前做好自測;QA測試時保證環(huán)境穩(wěn)定,不要隨意部署。


          7)同時作為后端負(fù)責(zé)人:進(jìn)行詳細(xì)的需求分析和拆解,安排好后端人員的開發(fā),做好codereview、方案設(shè)計(jì)。


          8)項(xiàng)目結(jié)束后及時進(jìn)行總結(jié),觀察項(xiàng)目目標(biāo)達(dá)成情況,及時進(jìn)行復(fù)盤。



          穩(wěn)定性保障


          關(guān)于穩(wěn)定性保障的回答思路可以從“事前預(yù)防預(yù)警”、“事中快速止損”、“事后復(fù)盤總結(jié)”去展開。


          事前預(yù)防預(yù)警:穩(wěn)定性架構(gòu)設(shè)計(jì)、防御式編程、業(yè)務(wù)可降級、力保核心鏈路、慢SQL/接口優(yōu)化、日常巡檢、灰度發(fā)布、業(yè)務(wù)指標(biāo)監(jiān)控、系統(tǒng)指標(biāo)監(jiān)控、全鏈路壓測、限流等。


          事中快速止損:如果剛上線則快速回滾、及時周知上級及相關(guān)業(yè)務(wù)方、降級開關(guān)、限流等,關(guān)鍵思路是先止損而不是糾結(jié)于問題。


          事后復(fù)盤總結(jié):找出問題根源、5whys分析法、制定相應(yīng)的優(yōu)化措施、組織團(tuán)隊(duì)進(jìn)行復(fù)盤等。



          真題:場景題


          給出一個場景,問怎么進(jìn)行整個系統(tǒng)的設(shè)計(jì),包括表結(jié)構(gòu)設(shè)計(jì),數(shù)據(jù)的處理等等。


          思路:這種題比較考驗(yàn)綜合能力,沒法提前準(zhǔn)備,只能靠平時的積累了。不過場景題的大方向基本是數(shù)據(jù)量很大,性能優(yōu)化這些,所以在這方面有積累的同學(xué)可能比較容易對付。



          面試技巧


          合理安排面試順序


          剛開始面試時,一定要先找?guī)准夜揪毦毷郑硐胫械墓痉旁诤竺妫嬖囀切枰獣r間進(jìn)入狀態(tài)的,所以切記不要一上來就面自己想進(jìn)的公司。



          保持自信


          面試時,很多題目其實(shí)是自己剛復(fù)習(xí)過的,所以此時你對這些題目的理解可能是比面試官更好的,所以一定要自信點(diǎn),自信有利于自己更好的發(fā)揮。



          主動引導(dǎo)


          面試前我們都會準(zhǔn)備一些能讓面試官眼前一亮的東西,但是面試時并不一定會被問到,這個時候你得想辦法去引導(dǎo)到這個話題上。



          最后


          目前國內(nèi)的 Java 環(huán)境競爭挺大的,各種內(nèi)卷,瘋狂卷,卷的不可開交,要想全部準(zhǔn)備好基本不可能。


          所以除了做好面試前的準(zhǔn)備,平時日常工作也需要多思考、多總結(jié)、多積累,在面試遇到?jīng)]見過的題目時,才能更從容的應(yīng)對。


          另外,關(guān)于算法題,在寫本文的時候,我發(fā)現(xiàn)自己已經(jīng)好多算法開始記憶模糊了,好可怕,感覺自己后面得出點(diǎn)算法題文章,加深下印象,哎,真雞兒難哦。

          瀏覽 68
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人毛片女人免费看 | 北条麻纪一区二区三区在线观看视频 | 欧美日韩一级在线观看 | 十八禁啪啪视频 | 五月婷婷久草 |