對于很多沒有學歷優勢的人來說,面試大廠是非常困難的,這對我而言,也是一樣,出身于二本,原本以為就三點一線的生活度過一生,直到生活上的變故,才讓我有了新的想法和目標,因此我這個二本渣渣也奮斗了起來,竟拿下了今日頭條Java工程師Offer,今天分享這波面經,主要是希望能夠激勵到同樣被學歷所困擾的技術人,能夠對職業生涯和技術規劃有一個參考價值,感謝!
一、面試今日頭條Java工程師難在哪?(面試難點)
(1)難在“心態”
首先需要克服的第一關,實際上就是自己的心態,因為我是二本出身,base比較低,所以面試今日頭條本就是一件沒太大底氣的事情,更何況是高級開發崗,所以心里就更容易沒底,因此,在準備面試之前,調整心態這件事情就做了很久,所以難在“心態”一點也沒錯,心態沒調整好,面試幾乎是沒戲的,
(2)難在“要求”
其次就是要求,所謂的要求實際上就是阿里對崗位的任職要求,也就是作為開發人員,你掌握了多少技術堆疊?
首先,你簡歷上寫的肯定要會,其次就是你要擁有一些亮點,也就是說對某個技術有深入的了解,這樣才能給面試官耳目一新的感覺,
那么,面試今日頭條Java工程師,需要掌握多少呢?
- Java集合:HashMap和ConcurrentHashMap,平時最好有讀一些原始碼,最好知道每個引數為什么設定成這么大?有什么好處?
- JUC包肯定要學,即使平時的編程根本不用,也必須得會,至少要知道aba,cas,aqs,unsafe,volatile,sync,以及常見的各種lock,死鎖,執行緒池引數等,也必須要明白自旋,阻塞,死鎖和它如何去定位,oom如何定位問題,cpu過高如何定位等基本的操作,你可以沒有生產除錯經驗,但不代表你可以不會top,jps,jstack,jmap這些可能會問的東西,以及可能衍生的jmm模型和mesi協議等,
- 大廠必問JVM:垃圾回收演算法,垃圾收集器、JVM記憶體模型,每個區域用途,各種oom的種類,jvm調優經驗,類加載程序,雙親委派等,
- Spring就得抽空看原始碼了,一般會問到bean的生命周期,如何解決回圈依賴,實作事務原理,動態代理原理等,
- Dubbo也是必須問的,設計框架,負載均衡,
- Redis更要多懂一點,單執行緒模型,aof,rdb,rewrite,主從,cluster,哪些型別?包含一些快取常見的問題擊穿、穿透、雪崩、資料一致性等,
- Mysql,事務,鎖,索引,b+樹,主從這些你必須會
- Mq ,我用的rocketmq,你得知道為什么用,重復消費,順序訊息,事務訊息,高可用,訊息丟失,擠壓場景,整個訊息發送消費的流程,讀過原始碼更佳,更好吹
- Netty的話,零拷貝,bio,nio,aio,架構設計怎么樣子的?用過看過更好
- 演算法,建議去刷題,我運氣好,簡單的演算法讓我碰到了,一些快排,堆排,二叉樹相關的,鏈表反轉,成環,環節點,跳樓梯等常規的簡單演算法建議刷刷,雙指標,dp,遞回這些還是多找找感覺,大資料記憶體有限的場景的統計,有時間一些middle可以去試試,手寫紅黑樹你要是可以,那我估計演算法你穩了,
- 網路,http,tcp,https,udp,7層網路協議等,最好結合自己理解,背,你都要背下來,
- 還有就是一些分布式事務實作,架構實作,比如搶紅包,高并發下單等常規的場景設計,你來設計,你怎么去設計?多找一些大牛或者上網自己查,幫你看看有哪些漏洞,有哪些解決方案?業界有哪些好的中間件?

二、今日頭條Java工程師面試真題(共三面)
一面
- 寫一個題,找一個無序陣列的中位數
- 寫了個快排,然后讓我找到無序陣列第k大的一個數,我說先排序再找,實際上可以用快排的partition函式,
- 快排的時間復雜度,最壞情況呢,最好情況呢,堆排序的時間復雜度呢,建堆的復雜度是多少,nlgn,
- 作業系統了解么,Linux和windows
- 說說Linux的磁盤管理,一臉懵逼
- Linux有哪些行程通信方式,五大件
- Linux的共享記憶體如何實作,大概說了一下,
- 共享記憶體實作的具體步驟,我說沒用過
- socket網路編程,說一下TCP的三次握手和四次揮手,中間網路不好,面試官都沒聽清楚,很尷尬
- 跳過網路,問了專案的一些東西
- 問我如何把docker講的很清楚,我從物理機,虛擬機到容器具體實作稍微說了下,
- 問我cgroup在linux的具體實作,不會,
- 多執行緒用過哪些,chm和countdownlatch在實習用過
二面
- 自我介紹
- Java的集合類哪些是執行緒安全
- 分別說說這些集合類,hashmap怎么實作的,扯了很多
- MySQL索引的實作,innodb的索引,b 樹索引是怎么實作的,為什么用b 樹做索引節點,一個節點存了多少資料,怎么規定大小,與磁盤頁對應,
- MySQL的事務隔離級別,分別解決什么問題,
- Redis了解么,如果Redis有1億個key,使用keys命令是否會影響線上服務,我說會,因為是單執行緒模型,可以部署多個節點,
- 問我知不知道有一條命令可以實作上面這個功能,不知道
- Redis的持久化方式,aod和rdb,具體怎么實作,追加日志和備份檔案,底層實作原理的話知道么,不清楚,
- Redis的list是怎么實作的,我說用ziplist quicklist實作的,ziplist壓縮空間,quicklist實作鏈表,
- sortedset怎么實作的,使用dict skiplist實作的,問我skiplist的資料結構,大概說了下是個實作簡單的快速查詢結構,
- 了解什么訊息佇列,rmq和kafka,沒細問
- 寫題時間到,第一題:寫一個層序遍歷,
- 第二題:寫一個插入樹節點到一顆排序樹的插入方法,使用遞回方式找到插入位置即可,
- 第三題:一個有向圖用鄰接矩陣表示,并且是有權圖,現在問怎么判斷圖中有沒有環,
我說直接dfs走到原點即為有環,剛開始寫的時候我又問了一嘴是不是只要找到一個就行,面試官說是的,然后我說這樣應該用bfs,有一次訪問到原節點就是有環了,
面試官問我不用遞回能不能做這個題,其實我都還沒開始寫,然后我就說沒有思路,他提示我拓撲圖,我沒明白拓撲圖能帶來什么好處,現在一想,好像當訪問程序中找不到下一個節點時就說明有環,做一個訪問標記應該就可以,
- 第四題:一個二叉樹,找到二叉樹中最長的一條路徑,
我先用求樹高的方式求出了根節點的左右子樹高度,加起來便是,
然后面試官提示需要考慮某個子樹深度特別大的情況,于是我用遍歷的方式重繪最大值,用上面那個方法遍歷完整個樹即可,
面試官說復雜度比較高,但是由于時間問題就說結束了,
三面
- 介紹一下專案
- 你談到的并發技術,chm和countdownlatch怎么使用的
- 為什么要這么處理,使用執行緒池是不是也可以,我說也可以
- 作業系統的行程通信方式,僵尸行程和孤兒行程是什么,如何避免僵尸行程,我說讓父行程顯示通知,那父行程怎么知道子行程結束了,答不會,
- 計算機網路TCP和UDP有什么區別,為什么迅雷下載是基于UDP的,
我說FTP是基于TCP,而迅雷是p2p不需要TCP那么可靠的傳輸保證,他說不對,我說是不是因為要建立連接,開銷比較大,他說不對,我說p2p的發送節點很多,所以不是那么需要各種傳輸保證,他說不對,我說TCP會自動分包而TCP可以自己定義資料長度,,他還是說不對,最后他說算了,我們問下一個吧,
- 作業系統的死鎖必要條件,如何避免死鎖,
- 寫一個LRU的快取,需要完成超時淘汰和LRU淘汰,
我說用lhm行不行,他說用linkedlist和hashmap可以,于是我就寫了put和get函式,進行了隊頭隊尾操作,他說get復雜度會不會太高,我瞎掰了半天沒找到辦法,他說那就這樣吧,今天面試到這,
HR面
- 興趣愛好
- 三年到五年的職業規劃
- 意向公司和城市
- 作業經歷和識訓
- 作業中最大的困難
- 為什么換公司
- 你的缺點和優點
- 你覺得你比其他人優秀的地方說三個
- 為什么想來我們部門
- 巴拉巴拉
三、拿下今日頭條Java工程師offer前,我做了些什么?
(1)準備簡歷
簡歷是門面,更是敲門磚,能否拿到大廠的面試機會,就要看自己的簡歷如何,拋開學歷意外,大廠最看重簡歷是否有亮點,因此我們對簡歷內容要有準備,對自己的突出點,包括技術、個性上的亮點,要練習表達,避免臨時組織語言,
(2)提升技能
實際上我有個今日頭條作業的朋友很早之前就向我透露過,很多人認為大廠看重學歷,但實際情況并不完全是,在今日頭條只以能力論英雄,所以,在日常生活中,通過不斷地學習,提升自己的能力,努力去拉近自己與目標值的距離,這是很有必要的,也是未來的必然趨勢,
關于我是如何提升我的技術堆疊的:
① 閱讀實戰檔案包括一些原始碼筆記和技術筆記
全部資源獲取方式已放在文末!

② 猛刷面試題
全部資源獲取方式已放在文末!

做個總結
很多學歷不太好的人,可能對自己沒有太大的信心,實際上任何事情都有“奇跡”發生,而這個“奇跡”關鍵還是要靠自己去創造,無論你是小白菜鳥,還是技術大牛,日常都不能夠落下學習這件事情,一旦落后下來,就容易遭到淘汰,做一個有深度,有廣度的程式員,趕緊學習起來吧!
以上我的經歷希望能夠給大家帶來幫助,另外自己手頭上的資料整理均可免費分享,需要這些資料的朋友一鍵三連后掃描👇二維碼添加小助理, 即可獲得免費領取方式,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/271606.html
標籤:其他
