緣起
相信很多人看到標題都會想:“這怎么面試還能久病成良醫了?這多跳槽多少次呀,又或者說得多有菜雞,屢面屢涼,屢涼屢面?”,自我認為在技術上應該算中階偏上未到高階,,裸辭跳槽前在上一家公司,坐標上海,工資有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!如果需要我整理的面經資料的小伙伴,可以隨手點贊+任意評論后,點擊這里快速領取!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/233902.html
標籤:其他
