久病成良醫,阿里、騰訊、字節、華爲、百度等大廠面經分享!已拿字節offer!

緣起

相信很多人看到標題都會想:“這怎麼面試還能久病成良醫了?這多跳槽多少次呀,又或者說得多有菜雞,屢面屢涼,屢涼屢面?”。自我認爲在技術上應該算中階偏上未到高階,,裸辭跳槽前在上一家公司,座標上海,工資有16k,可無奈於自己一直有個大廠夢,能進大廠是一個程序員技術水平,能力各方面最好的見證(個人理解)!
狗頭保命

其實自己擠破腦袋,破釜沉舟的想進大廠的根本原因還是大廠和小公司真的不一樣。我是雙非本科15年畢業的,畢業之後就一直在做Android相關方面的開發工作,到18年經歷了兩家創業公司,一家工作了不到半年老闆就跑路了,一家工作到18年初,因爲運營不當倒閉了(一度懷疑自己是不是去哪家公司就得哪家倒閉)。

在小公司做開發,一個同時開發幾個app也是比較常見的,而且公司的代碼和項目管理都非常的不規範,一些祖傳代碼能讓你一些白了頭。諸多因素綜合下來更加堅定了我奔大廠的決心,提升技術能力也好,鍍金也罷,又或是開篇說的一種能力的見證,在今年5月份我毅然決然的選擇了裸辭,開始我的奔大廠之路。

至6月結束,面完了網易、oppo、拼多多,結果都是涼涼(內心還是很虛的,所以先找了些規模偏小的大廠下手)。總體的一個感覺就是,感覺面試官問的感覺都會,但是就是卡在喉嚨裏面說不出來,問到一些底層,源碼方面的東西,更是腦子一片空白,有個面試官甚至反問我,“你之前的16k是怎麼拿到的?”。準備還是太不充分了,突然意識到,隨後在7月份開始降低了面試的頻率,開始複習,從java基礎到底層源碼,該背的背,該寫的寫,並在每次面試之後記錄下面試官的問題,回去做覆盤和延伸,實踐出真知。

落定

功夫不負有心人,經過兩個多月的學習提升和麪試“實踐”,趁着“金九銀十”這股東風,在9月中旬拿到了字節的offer,除了自己的努力之外,可能還有一部分原因就是字節最近一直在擴大招聘吧(手動狗頭),讓我有了“趁虛而入”的機會。定薪25k,每天都有免費下午茶,還有不限量的零食自取,21點以後車費報銷,996的“福報”我在程序員本命年拿到了(996+1024=2020)。

這篇面經分享文章一直等到現在才寫,一個原因是剛進公司沒多久,自然要表現出對“福報”的感恩戴德,抽不出時間來再做總結分享。還有一個原因就是自己都不確定自己分享到底有沒有價值或者是借鑑意義,到現在還一直感覺自己是以一種“幸運兒”的身份進來的,畢竟之前面試的大廠沒有一個拿到offer的。不過也可能這就是傳說中的“越努力越越幸運吧”!

之前複習的學習筆記包括各大廠的面試題面經,爲了方便自己覆盤和系統化的學習,都做了歸納如下:

一、Java 基礎相關

1.1 數據結構與算法

1.1.1 常用的數據結構有哪些?
1.1.2 數組
(1).如何在一個1到100的整數數組中找到丟失的數字?
(2).如何在給定的整數數組中找到重複的數字? (小米)
(3).如何在未排序整數數組中找到最大值和最小值?(字節跳動)
(4).在Java中如何從給定數組中刪除多重複制?
(5).大數相加(今日頭條)
1.1.3 鏈表
(1).那查詢第一個跟倒數第二個呢?(這就不一樣了,第一個直接給了頭結點,倒數第二個需要從倒數第一個開始查詢,走兩步) (騰訊)
(2).arrayList底層原理 (滴滴 字節跳動)
(3).如何在一次遍歷中找到單個鏈表的中值?(中國平安)
(4).如何證明給定的鏈表是否包含循環?如何找到循環的頭節點? (優酷)
(5).兩個有交叉的單鏈表,求交叉點 (華爲)
(6).如何得到單鏈表的長度? 360
(7).如何在不使用遞歸的情況下逆轉單鏈表? (小米/美團)
(8).怎麼判斷鏈表有環? (滴滴)
1.1.4 隊列&堆棧
(1).如何使用棧實現隊列的功能?(廣州荔枝FM)
(2).兩個棧實現一個隊列 (蘑菇街)
(3).兩個隊列實現一個棧 (騰訊)
(4).對比一下隊列和棧,以及它們底部實現 (騰訊)
1.1.5 二叉樹
(1).如何在給定的二叉樹中執行先序遍歷?(百度)
(2).如何實現後序遍歷算法? (百度)
(3).如何在給定數組中執行二分法搜索? (蘇寧)
(4).已知前序遍歷爲{1,2,4,7,3,5,6,8},中序遍歷爲{4,7,2,1,5,3,8,6},它的二叉樹是怎麼樣的? 58
(5).輸入兩棵二叉樹 A 和 B,判斷 B 是不是 A 的子結構。 (愛奇藝)
(6).請實現兩個函數,分別用來序列化二叉樹和反序列化二叉樹。 (YY)
(7).平衡二叉樹和紅黑樹的區別?(字節跳動)
(8).什麼是平衡二叉樹,它有什麼特徵 (美團)
(9).B 樹,B+樹
1.1.6 HashMap
(1).HashMap的底層原理是什麼?線程安全麼? (百度 美團)
(2).HashMap中put是如何實現的? (滴滴)
(3).談一下hashMap中什麼時候需要進行擴容,擴容resize()又是如何實現的?
(4).什麼是哈希碰撞?怎麼解決? (滴滴 美團)
(5).HashMap和HashTable的區別 (小米)
(6).HashMap中什麼時候需要進行擴容,擴容resize()是如何實現的? (滴滴)
(7).hashmap concurrenthashmap原理 (美團)
(8).arraylist和hashmap的區別,爲什麼取數快?(字節跳動)
1.1.7圖
 (1).旋轉輸出矩陣
(2).給定一個矩陣 int matrixA[m][n],每行每列都是增序的,實現一個算法去尋找矩陣中的某個元素 element. 搜狗









































1.1.8排序算法有哪些?
(1).top-k排序(堆排序,位圖法) (美團)
(2).冒泡排序的手寫 (華捷艾米)
(3).堆排序算法的手寫 (華捷艾米)
(4).橢圓形場地有兩個賽道,可以同時提供兩匹馬比賽,兩匹馬比賽後,可以獲知兩匹馬中跑的快的那匹馬,但是沒有計時工具。問題,如何最優的算法(比賽次數最少),獲知10匹馬中速度最快的三匹馬 (阿里)
(5).輸入一個整型無序數組,對堆排序的方法使得數組有序 (阿里)
(6).如何使用快速排序算法對整數數組進行排序? (CVTE)
1.1.9 查找算法
(1).有序數組的二分查找算法 (百度)
1.1.10 串
(1).給定一個字符串,請你找出其中不含有重複字符的 最長子串的長度。 (字節跳動)
(2).給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
1.1.11 請寫出以下算法的時間複雜度
冒泡排序法 插入排序法 堆排序法 二叉樹排序法
1.1.12 其他算法
(1).常用的對稱加密算法,有什麼同? (字節跳動)
(2).如何在無序(有負數)的數組中查找是否存在和爲target的兩個數組合,twoSum(); (字節)















1.2 Java基礎
(1).什麼情況下會發生棧內存溢出?
(2).如果讓你寫一段棧溢出的代碼你會什麼寫,一個棧大概有多大,爲什麼?每個線程都有這樣大小的一個棧嗎? (美團)
(3).JVM中一次完整的GC流程是怎樣的,對象如何晉升到老年代?
(4).介紹下GC回收機制與分代回收策略。
(5).Java中有幾種引用關係,它們的區別是什麼?
(6).GC收集算法有哪些?它們的特點是什麼?
(7).如何判斷一個對象是否被回收,有哪些GC算法,實際虛擬機使用最多的是什麼GC算法?(美團)
(8).Jvm內存 結構說一下。
a.描述JVM內存模型。(東方頭條)
(9).JVM DVM ART的區別(360)
(10).描述GC機制。Class會不會回收?用不到的Class怎麼回收?(東方頭條)
(11).StackOverFlow與OOM的區別?分別發生在什麼時候,JVM棧中存儲的是什麼,堆存儲的是什麼?(美團)
(12).Java虛擬機和Dalvik虛擬機的區別?
(13).請描述new一個對象的流程。
(14).Java對象會不會分配到棧中?
(15).String, Stringbuffer, StringBuilder 的區別是什麼?(東方頭條)
a.String StringBuffer StringBuilder在進行字符串操作時的效率;這裏主要考察String在內存中是如何創建的。(字節跳動)
(16).String爲什麼是不可變的?(字節跳動)
a.String爲什麼設計成final的?
(17).final 、finally、finalize 區別。
(18).抽象類和接口的區別。
(19).重載和重寫的區別 (京東)
(20).什麼是值傳遞和引用傳遞,Java 是值傳遞還是引用傳遞?
(21).String s = new String(“”);創建了幾個對象?
(22).java裏 equals和== 區別。
(23).try-catch-finally,try裏有return,finally還執行麼?
(24).Excption與Error區別。
(25).Static class 與non static class的區別。
(26).PathClassLoader與DexClassLoader的區別是什麼?
(27).什麼是雙親委託機制,爲什麼需要雙親委託機制?
(28).描述JVM類加載過程。
(29).動態代理是什麼?如何實現?
(30).動態代理的方法怎麼初始化的?(字節跳動)
(31).CGLIB動態代理(字節跳動)
(32).說說反射的應用場景,哪些框架,原理是什麼?
(33).Java泛型的特點與優缺點,泛型擦除是怎麼回事?
(34).List能否轉爲List。
(35).泛型super和extends的區別。
a.說法2:Java 的泛型,<? super T> 和 <? extends T> 的區別。
(36).爲什麼IO是耗時操作?







































1.3 併發編程

(1).假如只有一個cpu,單核,多線程還有用嗎 ?(美團)
(2).sychronied修飾普通方法和靜態方法的區別?什麼是可見性?
(3).鎖分哪幾類?
(4).CAS無鎖編程的原理。(字節跳動)
(5).ReentrantLock的實現原理。
(6).AQS原理 (小米 京東)
(7).Synchronized的原理以及與ReentrantLock的區別。(360)
(8).Synchronized在JDK1.8之後做了哪些優化 (京東)
(9).Synchronized static與非static鎖的區別和範圍(小米)
(10).volatile關鍵字幹了什麼?(什麼叫指令重排) (字節跳動)
(11).volatile 能否保證線程安全?在DCL上的作用是什麼?
(12).volatile和synchronize有什麼區別?(B站 小米 京東)
(13).兩個線程用不同的對象,怎麼樣?(字節跳動)
(14).什麼是守護線程?你是如何退出一個線程的?
(15).sleep 、wait、yield 的區別,wait 的線程如何喚醒它?(東方頭條、字節跳動)
(16).sleep是可中斷的麼?(小米)
(17).實現非阻塞式生產者消費者(字節跳動)
(18).如何開啓一個線程,開啓大量線程會有什麼問題,如何優化?(美團)
(19).線程生命週期。
(20).ThreadLocal是什麼?
(21).AyncTask的原理。
(22).AsyncTask中的任務是串行的還是並行的?
(23).線程池管理線程原理。
(24).線程池的相關參數,有哪些類型的線程池,線程池任務如何調度,任務隊列只是先進先出的隊列嗎,任務有優先級怎麼辦,知道優先級反轉嗎? (美團)
(25).有三個線程T1,T2,T3,怎麼確保它們按順序執行?
(26).Android中操作多線程的方式有哪些?
(27).怎樣獲取當前線程是否是主線程 (字節跳動)
(28).HandlerThread是什麼?
(29).線程間如何通信?
(30).RxJava線程切換原理,RxJava1和RxJava2的區別有哪些?




























1.4 網絡編程
(1).描述TCP三次握手與四次揮手的過程與意義。
a.TCP的三次握手過程?爲什麼會採用三次握手,若採用二次握手可以嗎?
b.三次握手爲什麼不是兩次一次 五次六次(美團)
(2).TCP與UDP的區別是什麼?(騰訊)
(3).Http與Https的關係是什麼?
(4).SSL握手的過程。
(5).Http的post與get請求的區別是什麼?
(6).輸入一個URL到瀏覽器發生了什麼?(美團)







二、Android體系

(1). Acitvity的生命週期是什麼樣的?
a. Acitvity的生命週期,如何摧毀一個Activity? (美團)
(2). Activity的4大啓動模式,與開發中需要注意的問題,如onNewIntent() 的調用;
a. Activity的啓動模式,區別 (美團)
b. singleInstance如果不指定棧名,是怎麼分配的?(字節跳動)
(3). Intent顯示跳轉與隱式跳轉,如何使用?(美團)
(4). Activity A跳轉B,B跳轉C,A不能直接跳轉到C,A如何傳遞消息給C?(美團)
(5). Activity如何保存狀態的?
(6). 請描訴Activity的啓動流程,從點擊圖標開始。(B站)
a. APP是怎麼啓動的?
b. 啓動一個Activity的流程分析
(7). Service的生命週期是什麼樣的?
a. Service兩種生命週期以及區別
(8). 你會在什麼情況下使用Service?
(9). startServer和bindServier的區別?(美團)
(10). Service和Thread的區別?
(11). IntentService與Service的區別?
(12). ContentProvider如何自定義與使用場景是什麼?
(13). BroadcastReciver的靜態註冊與動態註冊的區別?
(14). 廣播的分類與工作原理
(15). 可以再onReceive中開啓線程麼,會有什麼問題?
(16). 什麼是有序廣播?
(17). Application、Activity、Service中context的區別?能否啓動一個activity、dialog?
(18). Fragment的生命週期?  (美團)
(19). Fragment的構造函數爲啥不讓傳參?(B站)
(20). Fragment add與replace的區別,分別對Fragment的生命週期影響(美團)
























三、View System

(1).View繪製流程與自定義View注意點。(東方頭條、美團)
Android中的每一個UI控件都是集成自View,然後這些View都具有相同的繪製流程,必須經過measure,layout和draw.
view的繪製流程是在Window添加過程中,ViewRootImpl類的setView方法開始的
(2).在onResume中可以測量寬高麼
(3).事件分發機制是什麼過程?(東方頭條)
(4).事件衝突怎麼解決?(東方頭條)
(5).View分發反向制約的方法?(字節跳動)
(6).自定義Behavior,NestScroll,NestChild。(東方頭條)
(7).View.inflater過程與異步inflater(東方頭條)
(8).inflater爲什麼比自定義View慢?(東方頭條)
(9).onTouchListener onTouchEvent onClick的執行順序。(58 京東)
(10).怎麼攔截事件 onTouchEvent如果返回false onClick還會執行麼?(58 京東)
(11).事件的分發機制,責任鏈模式的優缺點 (美團)
(12).動畫的分類以及區別(車和家)
(13).屬性動畫與普通的動畫有什麼區別?(車和家)
(14).插值器 估值器的區別(車和家)
(15).RecyclerView與ListView的對比,緩存策略,優缺點。(美團)
(16).WebView如何做資源緩存?(字節跳動)
(17).WebView和JS交互的幾種方式與攔截方法。(字節跳動)
(18).自定義view與viewgroup的區別
(19).View的繪製原理
(20).View中onTouch,onTouchEvent和onClick的執行順序
(21).View的滑動方式
(22).invalidate() 和 postInvalicate() 區別
(23).View的繪製流程是從Activity的哪個生命週期方法開始執行的
(24).Activity,Window,View三者的聯繫和區別
(25).如何實現Activity窗口快速變暗
(26).ListView卡頓的原因以及優化策略
(27).ViewHolder爲什麼要被聲明成靜態內部類
(28).Android中的動畫有哪些? 動畫佔用大量內存,如何優化
(29).自定義View執行invalidate()方法,爲什麼有時候不會回調onDraw()
(30).DecorView, ViewRootImpl,View之間的關係,ViewGroup.add()會多添加一個ViewrootImpl嗎
(31).如何通過WindowManager添加Window(代碼實現)?
(32).爲什麼Dialog不能用Application的Context?
(33).WindowMangerService中token到底是什麼?有什麼區別
(34).RecyclerView是什麼?如何使用?如何返回不一樣的Item
(35).RecyclerView的回收複用機制
(36).如何給ListView & RecyclerView加上拉刷新 & 下拉加載更多機制
(37).如何對ListView & RecycleView進行局部刷新的?
(38).ScrollView下嵌套一個RecycleView通常會出現什麼問題?
(39).一個ListView或者一個RecyclerView在顯示新聞數據的時候,出現圖片錯位,可能的原因有哪些 & 如何解決?
(40_.Requestlayout,onlayout,onDraw,DrawChild區別與聯繫
(41).如何優化自定義View
(42).Android屬性動畫實現原理,補間動畫實現原理










































四、Android FrameWork

1.Android中多進程通信的方式有哪些?
a.進程通信你用過哪些?原理是什麼?(字節跳動、小米)
2.描述下Binder機制原理?(東方頭條)
3.Binder線程池的工作過程是什麼樣?(東方頭條)
4.Handler怎麼進行線程通信,原理是什麼?(東方頭條)
5.Handler如果沒有消息處理是阻塞的還是非阻塞的?(字節跳動、小米)
6.handler.post(Runnable) runnable是如何執行的?(字節跳動、小米)
7.handler的Callback和handlemessage都存在,但callback返回true handleMessage還會執行麼?(字節跳動、小米)
8.Handler的sendMessage和postDelay的區別?(字節跳動)
9.IdleHandler是什麼?怎麼使用,能解決什麼問題?
10.爲什麼Looper.loop不阻塞主線程?
a.Looper無限循環爲啥沒有ANR(B站)
11.Looper如何在子線程中創建?(字節跳動、小米)
12.Looper、handler、線程間的關係。例如一個線程可以有幾個Looper可以對應幾個Handler?(字節跳動、小米)
13.如何更新UI,爲什麼子線程不能更新UI?(美團)
14.ThreadLocal的原理,以及在Looper是如何應用的?(字節跳動、小米)
15.Android 有哪些存儲數據的方式?
16.SharedPreference原理,commit與apply的區別是什麼?使用時需要有哪些注意?
17.如何判斷一個 APP 在前臺還是後臺?
18.如何做應用保活?
19.一張圖片100x100在內存中的大小?(字節跳動)
20. Intent的原理,作用,可以傳遞哪些類型的參數?
21.如果需要在Activity間傳遞大量的數據怎麼辦?
22.打開多個頁面,如何實現一鍵退出?
23.LiveData的生命週期如何監聽的?(B站)























五、性能優化專題

1.App穩定性優化
2.App啓動速度優化
3.App內存優化
4、App繪製優化
5.App瘦身
6.網絡優化
7.App電量優化
8.安卓的安全優化
9.爲什麼WebView加載會慢呢?
10.如何優化自定義View
11.FC(Force Close)什麼時候會出現?
12.Java多線程引發的性能問題,怎麼解決?
13.TraceView的實現原理,分析數據誤差來源。
14.是否使用過SysTrace,原理的瞭解?
15.mmap + native 日誌優化?













六、三方源碼理解

1.Glide :加載、緩存、LRU 算法 (如何自己設計一個大圖加載框架) (LRUCache 原理)
2.EventBus
3.LeakCanary
4.ARouter
5.插件化(不同插件化機制原理與流派,優缺點。侷限性)
6.熱修復
7.RXJava (RxJava 的線程切換原理)
8.Retrofit (Retrofit 在 OkHttp 上做了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的)
9.OkHttp







文末

以上部分題目也是自己在複習期間在網上找的一些大廠面試題。我自己也將這些面試題做了解析整理並歸納成了一個文檔,由於篇幅原因就沒在文章裏做展示了。好記性不如爛筆頭,永遠抱着一個“我應該會”的心態去刷面試題,在自己腦子過了一篇,感覺回答的上來,但往往一真跟面試官對上線就會卡殼,還是建議把每個面試題都去寫一遍,再去做延伸。當你能將每一道面試題都能富有邏輯性的寫出來的時候,那在面試的時候就絕對沒有問題了。

整理不易,如果覺得我的這篇分享對你有所幫助的話,點個贊支持一下吧!另外祝所有正在面試的小夥伴們,都能拿到自己理想的offer!如果需要我整理的面經資料的小夥伴,可以隨手點贊+任意評論後,點擊這裏快速領取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章