到今年7月抖锥,我已經(jīng)工作了整整3年!記得還是2017年的夏天碎罚,我脫下了屬于大學(xué)時代的學(xué)位服磅废,告別我的整個學(xué)生時代,當(dāng)我找到第一份正式的工作時荆烈,就已經(jīng)宣布我成為正式的上班族了拯勉!那個朝氣蓬勃的時代、也是一個屬于青春的年代憔购。現(xiàn)在回味宫峦、無比悠長。
原諒我矯情了一會兒玫鸟,現(xiàn)在進入正題导绷。想知道阿里面了5次,騰訊面了4次的我屎飘,為什么會入職字節(jié)跳動嗎妥曲?看官,請你們接著往下看钦购。
9面大廠的原因
我相信每一位軟件開發(fā)的畢業(yè)生都夢想著進入像BAT這樣一線大廠檐盟,你們都想著進入當(dāng)然我也不例外,誰叫我們都是“同道中人”呢肮雨!
先說說我吧遵堵,雖然我不喜歡別人夸但是你們夸我還是有一點小驕傲的。雙非一本畢業(yè),雖然談不上多么厲害但是也還行陌宿,別說讀研我是真的不喜歡讀書锡足,讀研天天要背英語單詞難道你們不覺得煩嗎?我比較喜歡有邏輯性的事物壳坪,因為這樣在之后的大廠面試中算法題基本都答對了蚀苛。
我吧,接觸編程接觸的比較早窄潭,在高一的時候因為我哥給我?guī)Я艘槐咀詫W(xué)C語言的書从铲,我便開始沉迷在編程的海洋里,一蹶不振蝎亚。到現(xiàn)在那本書我還沒有扔掉九孩,現(xiàn)在有時間的時候都會看一看,不過現(xiàn)在看來里面的知識點太少了发框,適合剛起步的新手學(xué)習(xí)躺彬。對了這本書叫《C primer plus》,安利一下梅惯。
因為高中三年都熱愛著編程宪拥,所以我高考完以后報考的志愿只能是計算機這一方向,別人說大學(xué)生活都是豐富多彩的铣减,我也信了高中老師的鬼話她君,說什么高中三年不要玩,好好學(xué)習(xí)等到上了大學(xué)隨便你玩葫哗,老師都不帶管你的缔刹。以至于到現(xiàn)在都還沒有女朋友,真氣死我了...
大學(xué)四年中魄梯,我自學(xué)過Java桨螺、Andorid、C++酿秸,到后來火熱的GO語言灭翔、AI,也有一定的了解辣苏,卻因為大學(xué)老師的一段話走上了APP的開發(fā)之路肝箱,因為當(dāng)年抖音的爆火,無數(shù)短視頻APP橫空出世稀蟋,他說:將來做Android的程序員肯定特別吃香煌张,聽了老頭這話一入坑便是三年。
雖然現(xiàn)在也挺好退客,在字節(jié)能到稅后34K骏融,但是我還是覺得链嘀,程序員需要的不是行情行業(yè),需要的是實力和技術(shù)档玻,只要你有硬實力怀泊,無論市場行情怎樣,走到哪都會公司企業(yè)接納你误趴。內(nèi)推不就是一個很好例子嗎霹琼?
5面阿里,4面騰訊的心路歷程
阿里和騰訊和字節(jié)一直是我追求目標凉当,其實畢業(yè)前枣申,我并沒有找到心儀的工作,只是找到了一家小型互聯(lián)網(wǎng)公司做Android開發(fā)(當(dāng)然看杭,是在面試完騰訊和阿里之后我才明白了我自身實力的不足)忠藤。
但是咱不能放棄,一次不行還有第二次楼雹,兩次不行還有無數(shù)次熄驼。起碼我得進他們的研發(fā)部看看他們的大牛到底有多厲害才能進得去那樣的大廠?
于是烘豹,我開始我的三年面試大廠之路;
三年诺祸,我卡死在無數(shù)面試題之下携悯,挫敗了我也成就了我
我這個人最好的好處就是會在失敗中總結(jié),面試遇到不會的題目我會在心中記下筷笨,面試結(jié)束以后再網(wǎng)上找答案憔鬼,在記錄在我自己的學(xué)習(xí)筆記中。
比如像Android的音視頻胃夏,UI線程轴或、view分發(fā)反向制約的方法、Future和microtask執(zhí)行順序仰禀,Java的對象鎖和類鎖照雁、生產(chǎn)者消費者(非阻塞式)我都會記下來。這也為我之后成功入職字節(jié)跳動做好了鋪墊答恶。
一面(2018年10月秋招)
簡單介紹項目
了解哪些數(shù)據(jù)結(jié)構(gòu)
了解哪些排序算法
堆排序
LinkedList與ArrayList饺蚊;HashMap擴容 ConcurrentHashMap
TCP與UDP,區(qū)別及運用場景
http是用的TCP還是UDP
http與https的區(qū)別
JVM內(nèi)存模型(Static方法在哪個區(qū))
Activity生命周期悬嗓,Activity啟動模式污呼,Handler源碼
旋轉(zhuǎn)數(shù)組
二面(2019年3月春招)
final、finally包竹、finalize的區(qū)別
抽象類的成員變量與成員方法的繼承
union與union all的區(qū)別
MySQL的索引的實現(xiàn)
B+樹查找的時間復(fù)雜度燕酷,數(shù)據(jù)結(jié)構(gòu)
在瀏覽器輸入網(wǎng)址敲回車后經(jīng)歷了什么
三次握手
https的加密流程
對稱加密與非對稱加密原理(RSA籍凝、AES)
手撕DCL單例
還了解什么設(shè)計模式
三面(2019年四月春招)
動態(tài)代理的方法怎么初始化的
cglib動態(tài)代理
三個線程wait,喚醒情況是什么樣的
最終是誰持有的activity苗缩,handler內(nèi)存泄露(內(nèi)存泄漏這點真的是無比幸運饵蒂,剛好找到的視頻里面講過)
handler的sendmessage和postdelay的區(qū)別
arraylist和hashmap的區(qū)別,為什么取數(shù)快
差不多重復(fù)的和模糊的
四面(2019年9月秋招)
stringbuilder 和stringbuffer區(qū)別
lock和syncrognized原理區(qū)別挤渐,適合什么場景苹享。
實現(xiàn)生產(chǎn)者,消費者
handler原理浴麻,是如何實現(xiàn)延時的得问。
一個activity啟動另外一個activity的生命周期。
反轉(zhuǎn)鏈表
歸并排序
快速排序
五面(2020年5月春招)
抽象類和接口解釋一下软免。
講講類的加載機制宫纬。
jvm的內(nèi)存回收機制,那你了解哪些內(nèi)存回收算法膏萧。主要用的那個算法漓骚。
抽象類和接口的區(qū)別。
Activity有哪些啟動模式
Fragment的生命周期和Activity有哪些不同榛泛,執(zhí)行順序解釋一下蝌蹂。(這個回答的有點迷,只能說大體是那么一回事)
線程和服務(wù)的區(qū)別,解釋一下曹锨。
事件分發(fā)機制講解一下孤个,view中有個onFilterTouchEventForSecurity還是啥,小哥哥說是view中獨有的一個方法沛简,你了解嗎齐鲤?(英語水平不過關(guān),沒聽清是啥方法椒楣,表示不清楚给郊。)
充值模塊如何進行的封裝
handler的機制講解一下。
模板方法講解一下(腦袋抽了捧灰,記不起來)
如何保證應(yīng)用的安全性淆九,做了哪些處理。
加固的原理了解嘛凤壁。
騰訊5面面經(jīng)
一面
- mmap + native 日志優(yōu)化吩屹?
講了傳統(tǒng)日志打印的兩個性能問題,一個是反復(fù)操作文件描述符表拧抖,一個是反復(fù)進入內(nèi)核態(tài)煤搜,然后講了 mmap 的原理機制。
- 廣播和 EventBus 的區(qū)別唧席?
說 EventBus 的實現(xiàn)原理是基于反射擦盾,里面管理了兩張表嘲驾,且代碼之間關(guān)聯(lián)性不大不易于維護,EventBus 不支持跨進程通信迹卢,被面試官反問你確定不支持跨進程辽故?我說我的看的源碼是不支持,面試官說那好吧腐碱。
- 常用設(shè)計模式你了解哪些誊垢?
我開始巴拉巴拉說了一大堆,其中說到了裝飾設(shè)計模式症见,被面試官打斷了喂走,請你具體說說裝飾設(shè)計模式。
- 跨進程通信有哪些谋作?
管道芋肠,信號,信號量遵蚜,文件帖池,本地套接字,共享內(nèi)存吭净,binder 驅(qū)動
- 簡單講講 binder 驅(qū)動吧睡汹?
從 Java 層來看就像訪問本地接口一樣,客戶端基于 BinderProxy 服務(wù)端基于 IBinder 對象寂殉,從 native 層來看來看客戶端基于 BpBinder 到 ICPThreadState 到 binder 驅(qū)動帮孔,服務(wù)端由 binder 驅(qū)動喚醒 IPCThreadSate 到 BbBinder 。然后又講了虛擬內(nèi)存不撑、物理內(nèi)存和內(nèi)存映射,跨進程通信的原理是要基于內(nèi)核的晤斩, 當(dāng)我講到 binder_open 焕檬、binder_mmap 和 binder_ioctl 是被面試官打斷了,估計是怕我講太久了澳泵。
- 跨進程傳遞大內(nèi)存數(shù)據(jù)如何做实愚?
我說 binder 肯定是不行的,因為映射的最大內(nèi)存只有 1M-8K兔辅,可以采用 binder + 匿名共享內(nèi)存的形式腊敲,像跨進程傳遞大的 bitmap 需要打開系統(tǒng)底層的 ashmem 機制。
- 說說 ConcurrentHashMap 的實現(xiàn)原理說下维苔,初始化大小是多少碰辅?
是線程安全的,實現(xiàn)原理采用的是分段鎖介时,初始化大小是 16 没宾,必須是 2 的冪次凌彬。
- 啟動優(yōu)化怎么優(yōu)化?
我說了關(guān)鍵優(yōu)化 Application 循衰,被面試官打斷了铲敛,說大家都能想到的東西你不要說了,我想聽的是你能不能站在系統(tǒng)的角度去做一些優(yōu)化会钝,我提到了優(yōu)化包體積大小能優(yōu)化啟動速度伐蒋,優(yōu)化 dex 分包能優(yōu)化啟動速度,可以參考最新的華為方舟編譯器等等迁酸。
- 你寫的 rxpay 和 rxlogin 具體怎么實現(xiàn)的先鱼?
一般我們集成第三方登錄和第三方支付 SDK 都需要監(jiān)聽 onActivityResult 方法,我是參考了 RxPermission 的實現(xiàn)方案添加了透明 Activity 胁出。
- kotlin + fullter 方面的
二面
單例設(shè)計模式都寫寫型型,靜態(tài)內(nèi)部類是怎么保證線程安全的?
synchronized 底層實現(xiàn)原理全蝶,ReentrantLock 公平鎖與非公平鎖闹蒜。
主線程等待所有線程執(zhí)行完畢,再執(zhí)行某個特定任務(wù)怎么實現(xiàn)抑淫?原理和源碼看過沒绷落?
自定義 view 的一般流程,要注意些什么如何優(yōu)化始苇,點擊事件和長按時間分別是怎么實現(xiàn)的砌烁?
四種啟動模式,在源碼分析中的原理是怎樣的催式?
講講 bindService 的過程函喉,你當(dāng)初是怎么優(yōu)化后臺服務(wù)進程的?
開發(fā)中你都用到了哪些設(shè)計模式荣月?說說當(dāng)時具體的場景管呵。為什么你要用方法工廠,另外兩種呢哺窄?
RxJava 在使用過程中碰到了某些不友好的錯誤一般怎么解決捐下?發(fā)現(xiàn)了內(nèi)存泄露一般怎么解決分析,有沒有碰到過系統(tǒng)服務(wù)內(nèi)存泄露的問題萌业?
你們用的 okhttp 坷襟?那你有沒有做過一些網(wǎng)絡(luò)優(yōu)化呢?比如弱網(wǎng)環(huán)境生年。
給你個數(shù) 1 吧婴程,比如 1000011 里面有幾個 1 ?
快排了解不抱婉?最壞的情況是怎樣排抬?如果有大量重復(fù)數(shù)據(jù)怎么優(yōu)化懂从?
三面
講講 handler 的底層實現(xiàn)原理? 這么簡單蹲蒲?問到碗里來了番甩,后面漸漸說到延遲消息是 nativePollOnce 來處理的,在 6.0 以上用的是 epoll 方式來監(jiān)聽文件描述符届搁。接著問道了為什么要用這種方案缘薛?它跟 poll 和 select 比起來有哪些優(yōu)勢?它是怎么監(jiān)聽的你看過它的內(nèi)部實現(xiàn)原理沒卡睦?反正感覺很難受了宴胧。
說說你做的日志記錄優(yōu)化? 把第一輪面試的又講了一通表锻,你在每個文件的最后寫入了當(dāng)前內(nèi)容的大小恕齐,你有沒有想過如果文件被破壞的情況?這種異常情況怎么處理瞬逊?后面還問到了加密和壓縮显歧。
你看過 binder 驅(qū)動的源碼,說說他的內(nèi)存映射過程确镊,說說客戶端等待服務(wù)端處理返回的流程士骤,如果要跨進程傳遞大內(nèi)存數(shù)據(jù)你具體會怎么做?簡單寫一寫吧蕾域。
在公司做過哪些優(yōu)化拷肌? 內(nèi)存優(yōu)化,啟動優(yōu)化旨巷,網(wǎng)絡(luò)優(yōu)化巨缘,包體積優(yōu)化,具體說說包體積優(yōu)化采呐。我提到了包體積優(yōu)化不僅僅是優(yōu)化了包的大小带猴,包體積太大從安裝的那一刻開始,我們的應(yīng)用就可能比較慢了懈万,因為 pms 會去拷貝解壓解析我們的 apk 安裝文件,會去優(yōu)化我們的 dex 等等靶病,包體積太大還會影響我們的啟動速度会通。然后就巴拉巴拉說具體怎么做,問到了為啥混淆資源能減少包體積大新χ堋涕侈?你當(dāng)時優(yōu)化的時候效果是怎樣的減少了多少?
開發(fā)過程中遇到的一些最難解決的問題煤辨? 提到了動態(tài)修復(fù)替換加載 so 裳涛,那你知道怎么修復(fù) class 嗎木张?怎么修復(fù)資源呢?后面又聊到了插件化端三,提到了 360 用的是借尸還魂舷礼,那如果我們在插件的 Androidmanifest.xml 中注冊了其它屬性該怎么解決,資源方面怎么處理郊闯?
四面
- 先談?wù)勛约旱捻椖?/li>
遠程數(shù)據(jù)庫傳輸圖片到app端妻献,我們當(dāng)時將圖片轉(zhuǎn)換成base64存在數(shù)據(jù)庫中,然后傳到app端团赁,app解析base64獲得bitmap育拨,直接顯示然后面試官瘋狂diss 為什么要將圖片轉(zhuǎn)成base64再傳(二面也diss這個,問是否可以直接傳圖片地址)
講一下http連接的框架
retrofit原理
什么是動態(tài)代理
自定義view
繼承viewGroup的情況
activity的生命周期
對handler機制的了解
字節(jié)跳動面試題
一面
Jvm虛擬機
messageQueue會不會阻塞ui線程
對象鎖和類鎖
之字形打印樹
還有其他的記不清了欢摄,主要是我對二面印象太深刻了
二面
dart是值傳遞還是引用傳遞熬丧、
Widget和element和RenderObject之間的關(guān)系
widget的root節(jié)點
mixin extends implement之間的關(guān)系
jvm內(nèi)存模型
Future和microtask執(zhí)行順序
dart中…的用法
await for
三面
linux網(wǎng)絡(luò)模型
b+樹
阻塞隊列
redis和MongoDB的區(qū)別。幾個概念對比怀挠,還有底層實現(xiàn)析蝴。
算法題: mergeksortedlist,時間復(fù)雜度如何唆香?
HashMap 如果一直 put 元素會怎么樣嫌变?hashcode 全都相同如何?equals方法都相同 如何躬它?
所以的面試題和答案都被我整理成PDF腾啥,這也為我入職字節(jié)跳動提供的保證,近期需要面試的冯吓,需要面試題參考的小伙伴(Github領(lǐng)忍却)PDF資料
文末
最后希望小伙伴們都能有個好的歸宿,找到高薪的工作组贺,拿到自己滿意的offer凸舵。一起朝著大廠努力前進,共勉失尖!喜歡的小伙伴可以拿出自己的小手指點個贊喲(#.#)