作者:哈登
前言
本篇文章給大家分享一下筆者面試的一些感受和經(jīng)驗。
筆者從前期準備到所有面試結(jié)束,花費了差不多3個月的時間。真可謂“面試造航母,工作擰螺絲”,面試過程真的很累很辛苦。
筆者面了很多公司,最終拿下了貓眼Offer;
有面試交流群小伙伴問我是怎么準備面試的,我也想談?wù)勎易罱囊恍┫敕ê陀媱潱蠹乙黄鹩懻?。因此寫下了這篇文章。
整體分為以下兩個方面:
- 自我介紹 & 項目經(jīng)驗
- 知識儲備
自我介紹
1、結(jié)合招聘崗位,只講重點。
簡歷內(nèi)容這么多,實際的你,更有很多很多可以描述的東西。但時間有限,沒有面試官會聽你說個沒完。
根據(jù)你求職的崗位,說重點即可。
其實簡歷制作的原則,也是一樣。只是自我介紹時間更短,內(nèi)容更精華。
2、有理有據(jù),少說空話。
如果你說“自己學(xué)習(xí)能力強”,這就是一句假大空的話。誰都可以說自己學(xué)習(xí)能力強。
你如果真的在這方面有突出,就要舉一個例子,比如是1個月從0到1考了什么證書等。
3、有開頭有結(jié)尾,有邏輯。
開頭問候,結(jié)尾總結(jié)。中間1、2、3條理清楚。
4、特別提醒。
自我介紹中的內(nèi)容,很可能是面試官后續(xù)發(fā)問的內(nèi)容。所以,一是要引起重視,講最重要的,你最想讓面試官知道的內(nèi)容。 而是做好準備,揚長避短,不要給自己挖坑。
比如前面你說自己學(xué)習(xí)能力強,但是沒有舉例子。
面試官很可能,順著你的話問你,怎么證明你學(xué)習(xí)能力強呢? 結(jié)果你答不上來,或者是非常普通的成績,根本不能算是“學(xué)習(xí)能力強”。 那你就是給自己挖坑了。
其實自我介紹也是每個人各有不同,說起來也只能提供大致的思路。和你具體的求職崗位、經(jīng)歷、個人風(fēng)格有很大的關(guān)系。
項目經(jīng)驗
項目經(jīng)驗這塊因人而異,把覺得做的有亮點的東西挑出來,從四個方面來準備:
- 功能模塊的實現(xiàn)
- 達到了什么效果
- 遇到了什么問題,是如何解決的
- 涉及到的相關(guān)知識點
項目經(jīng)驗和知識點 其實是一個雙向的過程,要 試圖去找到它們之間的聯(lián)系:
- 談到項目經(jīng)驗的時候,可以說:做完 xx 之后,我還去了解了一下 yy 背后的原理,xxx,這里體現(xiàn)的是 你是否有求知欲 。
- 談到知識點的時候,可以說:yy 的原理是這樣的,在 xx 項目中我是如何應(yīng)用它來解決問題的,這里體現(xiàn)的是 你是否具備把知識付諸實踐的能力。
知識儲備
很多人準備面試的時候,大多數(shù)就會這樣的,打開牛客網(wǎng),查找 “Android 面經(jīng)”,找?guī)讉€多的開始看。以及從各大技術(shù)交流平臺搜索Android面試題。開始刷題復(fù)習(xí)。
這雖然看起來很自然,但是并不是一種 健康的方式,面試題的作用應(yīng)當是查缺補漏,上學(xué)的時候也不是直接發(fā)習(xí)題冊然后對著答案學(xué)習(xí)吧?
知乎上有個問題,叫做 如何高效學(xué)習(xí),里面有一個回答我覺得很符合我自己的觀點,就是 建立起自己的知識體系,建立知識體系的目的在于:
- 鞏固記憶。
- 認識自己,找到自己的優(yōu)勢及不足。
- 把握復(fù)習(xí)的進度。
經(jīng)驗總結(jié)。
目前我參考和自己整理的總結(jié)的會分為以下幾個大點:
Java 相關(guān)
1.容器(HashMap、HashSet、LinkedList、ArrayList、數(shù)組等)
2.內(nèi)存模型
3.垃圾回收算法(JVM)
4.類加載過程(需要多看看,重在理解,對于熱修復(fù)和插件化比較重要)
5.反射
6.多線程和線程池
7.HTTP、HTTPS、TCP/IP、Socket通信、三次握手四次揮手過程
計算機網(wǎng)絡(luò)部分:
TCP 有哪些狀態(tài)
- 三次握手、四次揮手。為啥不是三次不是兩次
- HTTPS 和 HTTP 的區(qū)別,HTTPS 2.0 3.0?
- 瀏覽器輸入一個 URL 按下回車網(wǎng)絡(luò)傳輸?shù)牧鞒蹋?/li>
- 問的深一點的可能涉及到網(wǎng)絡(luò)架構(gòu),每層有什么協(xié)議,F(xiàn)TP 相關(guān)原理,例:TCP 建立連接后,發(fā)包頻率是怎么樣的?
- 設(shè)計模式(六大基本原則、項目中常用的設(shè)計模式、手寫單例等)
生產(chǎn)者模式和消費者模式的區(qū)別?
單例模式雙重加鎖,為什么這樣做?
知道的設(shè)計模式有哪些?
項目中常用的設(shè)計模式有哪些?
手寫生產(chǎn)者、消費者模式。
手寫觀察者模式代碼。
適配器模式、裝飾者模式、外觀模式的異同?
談?wù)剬?java 狀態(tài)機的理解。
談?wù)剳?yīng)用更新(灰度、強制更新、分區(qū)更新?)
9.斷點續(xù)傳
10.Java 四大引用
11.Java 的泛型, 和 的區(qū)別
12.問到泛型、泛型擦除、通配符相關(guān)的東西
13.??final?
?、??finally?
?、??finalize?
? 的區(qū)別
14.接口、抽象類的區(qū)別
Android 相關(guān)
1.自定義 View
ViewGroup 繪制順序 (例:自定義 ViewGroup 如何實現(xiàn) FlowLayout?如何實現(xiàn) FlowLayout 調(diào)換順序)
自定義 View 如何實現(xiàn)打桌球效果;
自定義 View 如何實現(xiàn)拉弓效果,貝瑟爾曲線原理實現(xiàn)?
2.事件攔截分發(fā)
事件分發(fā)已經(jīng)不是直接讓你講了,會給你具體的場景,比如 A 嵌套 B ,B 嵌套 C,從 C 中心按下,一下滑出到 A,事件分發(fā)的過程,這里面肯定會有 ACTION_CANCEL 的相關(guān)調(diào)用時機。
3.解決過的一些性能問題,在項目中的實際運用。
4.性能優(yōu)化工具
(TraceView、Systrace、調(diào)試 GPU 過度繪制 & GPU 呈現(xiàn)模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)
5.性能優(yōu)化 (講講你自己項目中做過的性能優(yōu)化)
網(wǎng)絡(luò):API 優(yōu)化、流量優(yōu)化、弱網(wǎng)優(yōu)化
內(nèi)存:OOM 處理、內(nèi)存泄漏、內(nèi)存檢測、分析、Bitmap 優(yōu)化 ,LeakCanary 原理,什么檢測內(nèi)存泄漏需要兩次?
繪制
電量:WeakLock 機制、JobScheduler 機制
APK 瘦身 (APK 瘦身是怎么做的,只用 armabi-v7a 沒有什么問題么?
APK 瘦身這個基本是 100% 被面試問到,可能是我簡歷上提到的原因。)
內(nèi)存抖動
內(nèi)存泄漏
卡頓 {如何檢測卡頓,卡頓原理是什么,怎么判斷頁面響應(yīng)卡頓還是邏輯處理造成的卡頓} ,BlockCanary 的原理
布局優(yōu)化、過度渲染處理、ANR 處理、監(jiān)控、埋點、Crash 上傳。
啟動優(yōu)化
6.Http[s]請求慢的解決辦法(DNS、攜帶數(shù)據(jù)、直接訪問 IP)
7.緩存自己如何實現(xiàn)(LRUCache 原理)
8.圖形圖像相關(guān):OpenGL ES 管線流程、EGL 的認識、Shader 相關(guān)
10.SurfaceView、TextureView、GLSurfaceView 區(qū)別及使用場景
動畫、差值器、估值器(Android中的View動畫和屬性動畫 、Android 動畫 介紹與使用)
11.屬性動畫、補間動畫、幀動畫的區(qū)別和使用場景
12.MVC、MVP、MVVM
相互間的區(qū)別和各種使用場景,如何選擇適合自己的開發(fā)架構(gòu)。
13.Handler、ThreadLocal、AsyncTask、IntentService 原理及應(yīng)用,Handler 機制原理,IdleHandler 什么時候調(diào)用。
14.Gradle(Groovy 語法、Gradle 插件開發(fā)基礎(chǔ))
15.熱修復(fù)、插件化
談?wù)剬?ClassLoader 的理解
雙親委托機制的好處
自定義 ClassLoader
插件化為什么會出現(xiàn),如何代碼加載,資源加載,代理 Hook)
16.組件化架構(gòu)思路
如何從一個老項目一步步實現(xiàn)組件化,主要問思路,考察架構(gòu)能力和思考能力。(需要考慮很多,每一步做什么,順序很重要)
組件化和模塊化的理解與區(qū)別?
17.系統(tǒng)打包流程
18.Android 有哪些存儲數(shù)據(jù)的方式。
19.SharedPrefrence 源碼和問題點;
20.sqlite 相關(guān)
sqlite 升級,增加字段的語句
數(shù)據(jù)庫框架對比和源碼分析
數(shù)據(jù)庫優(yōu)化及數(shù)據(jù)遷移問題
getWritableDatabase 和 getReadableDatabase 的區(qū)別
20.如何判斷一個 APP 在前臺還是后臺?
21.混合開發(fā)
Hybrid 做過嗎? 例:Android 通過WebView調(diào)用 JS 代碼 例:JS 通過WebView調(diào)用 Android 代碼;
Hybrid 通信原理是什么,有做研究嗎?
說說你用過的混合開發(fā)技術(shù)有哪些?各有什么優(yōu)缺點?
Android Framework
- AMS 、PMS
- Activity 啟動流程,App 啟動流程
- Binder 機制(IPC、AIDL 的使用)
4.講講 Linux 上的 IPC 通信,Binder 有什么優(yōu)勢,Android 上有哪些多進程通信機制?
項目中遇見了什么多進程場景?
AIDL 是什么?解決了什么問題?
談?wù)剬M程共享和線程安全的認知?
5.為什么使用 Parcelable,好處是什么?
6.Android 圖像顯示相關(guān)流程,Vsync 信號等
三方源碼
1.Glide :加載、緩存、LRU 算法
(如何自己設(shè)計一個大圖加載框架)
(LRUCache 原理)
2.EventBus
3.LeakCanary
4.ARouter
重點:Router 原理,如何實現(xiàn)組件間的通信,組件化平級調(diào)用數(shù)據(jù)的方式。
5.插件化(不同插件化機制原理與流派,優(yōu)缺點。局限性)
6.熱修復(fù)
7.RXJava
(RxJava 的線程切換原理)
8.Retrofit
(Retrofit 在 OkHttp 上做了哪些封裝?動態(tài)代理和靜態(tài)代理的區(qū)別,是怎么實現(xiàn)的)
9. OkHttp
1、OkHttp 源碼,網(wǎng)絡(luò)緩存
2、如果從網(wǎng)絡(luò)加載一個 10M 的圖片,說下注意事項
算法與數(shù)據(jù)結(jié)構(gòu)
1.單鏈表:反轉(zhuǎn)、插入、刪除
2.雙鏈表:插入、刪除
3.手寫常見排序、歸并排序、堆排序
4.二叉樹前序、中序、后序遍歷
5.最大 K 問題
6.廣度、深度優(yōu)先搜索算法
7.String 轉(zhuǎn) int。
核心算法就三行代碼,不過臨界條件很多,除了判空,還需要注意負數(shù)、Integer 的最大最小值邊界等;
8.如何判斷一個單鏈表有環(huán)?
9.鏈表翻轉(zhuǎn);
10.快排;
11.100 億個單詞,找出出現(xiàn)頻率最高的單詞。要求幾種方案;
12.鏈表每 k 位逆序;
13.鏡像二叉樹;
14.找出一個無序數(shù)組中出現(xiàn)超過一半次數(shù)的數(shù)字;
15.計算二叉樹的最大深度,要求非遞歸算法。
16.String 方式計算加法。
項目&HR
1.項目開發(fā)中遇到的最大的一個難題和挑戰(zhàn),你是如何解決的。(95% 會問到)
2.說說你開發(fā)最大的優(yōu)勢點(95% 會問到)
3.你為什么會離開上家公司
4.你的缺點是什么?
5.你能給公司帶來什么效益?
6.你對未來的職業(yè)規(guī)劃?
面試:如果不準備充分的面試,完全是浪費時間,更是對自己的不負責(zé)。
文末會給大家分享下我整理的Android面試專題及答案(這些題我基本都刷了三遍以上,畢竟年前突然被裁心里是有點迷),其中大部分都是大企業(yè)面試常問的面試題,可以對照這查漏補缺,當然了,這里所列的肯定不可能覆蓋全部方式,不過對大家找工作肯定是有幫助!
貓眼三輪面試
一面 (技術(shù)面): 20:00 ~ 21:12(8.27號)
- 自我介紹
- Handler是用來做啥的
- 每個線程都能有自己的Handler嗎
- Fragment和Activity之間傳遞數(shù)據(jù)
- Activity加載Fragment的方式
- add一個Fragment的時候已經(jīng)有一個Fragment的話,對之前的Fragment的生命周期的影響
- ActivityA啟動ActivityB的生命周期回調(diào)
- Activity的啟動模式(分別用于什么場景)
- onSaveInstance和onReStoreInstance作用
- ViewModel怎么實現(xiàn)的
- ViewModel是不是一直存在內(nèi)存中(比如我開啟了很多頁面,或者ViewModel持有Bitmap這樣的對象)
- Android用過哪些布局
- View的繪制會經(jīng)過哪些(onMeasure,onLayout,onDrow)
- 讓View重新繪制的方法(重繪時,onMeasure會調(diào)用幾次)
- onMeasure會執(zhí)行幾次
- ConstraintLayout經(jīng)常用到的屬性
- guaidline為什么不會在布局上顯示
- 事件分發(fā)機制
- Android中線程掛了進程會崩潰嗎?
- RxJava用過了哪些操作符
- Java內(nèi)存分為哪些區(qū)域
- 堆內(nèi)存溢出、棧溢出相同嗎
- 哪些場景下會發(fā)生棧溢出
- 創(chuàng)建的對象一般在哪個區(qū)域
- GCRoots有哪些
- 復(fù)制算法(GC算法之一)的流程
- 靜態(tài)內(nèi)部類和內(nèi)部類的區(qū)別
- volatile的作用是什么
- 禁止指令重排序是怎么實現(xiàn)的
- 為什么需要禁止指令重排序
- synchronized修飾靜態(tài)方法和普通方法時的區(qū)別
- synchronized可重入嗎
- 類鎖、對象鎖有區(qū)別嗎
- 兩個字符串,求相同的最長串
- 兩個玻璃球,100層,求出具體在哪一層扔下會碎
- 反問環(huán)節(jié)
二面(技術(shù)面): 10:27 ~ 11:20(8.31號)
- 自我介紹
- 問了一些項目里面的東西,聊聊是干啥的
- 為什么要用MVVM
- 數(shù)據(jù)變更UI自動更新怎么實現(xiàn)的,用的DataBinding嗎
- 什么是觀察者模式,有什么好處
- 什么情況下用責(zé)任鏈模式?哪里遇到過?有什么好處?
- 怎么實現(xiàn)的責(zé)任鏈模式
- 為什么okHttp里面用到責(zé)任鏈模式
- 用戶可以自定義多個攔截器嗎
- 有網(wǎng)狀態(tài)下的緩存和無網(wǎng)狀態(tài)下的緩存一樣嗎
- 緩存是自己做的還是okhttp做的
- 可以手寫一些sql嗎
- room是什么類型的數(shù)據(jù)庫
- room是怎么實現(xiàn)的,為什么不要寫sql呢
- livedata粘性事件
- jetpack還用過哪些
- navigation用來做什么
- TCP UDP區(qū)別
- 為什么需要三次握手和四次揮手
- 三次揮手不行嗎
- 兩次揮手呢(服務(wù)器接收到客戶端的FIN報文,立馬將回復(fù)客戶端ACK和自己的FIN報文一并發(fā)給客戶端可以嗎?)
- TCP屬于哪一層
- TCP的上一層是哪一層
- 應(yīng)用層常見的協(xié)議
- http與https的區(qū)別
- https怎么進行的加密
- 對稱加密和非對稱加密的方式
- 你知道的非對稱和對稱加密有哪些
- 給定字符串“abcdefg”,打印出長度為4,并且不重復(fù)的的字符串組合(eg: “abcd”、“abce”,而"abcd"和"abdc"這種僅順序不同的串屬于同一個);
三面 (非技術(shù)面): 11:00~11:20(9.1號)
- 自我介紹(不要說前兩面說到的,說點有意思的。ps:內(nèi)心想法,我盡量哭的小聲點。。。 ????)
- 簡歷上的項目是基于什么初衷寫的
- 當初為什么選擇Android
- Retrofit,Rxjava,okHttp這些是怎么接觸到的
- jetpack呢
- MVVM和MVP說說你的理解
- 平時怎么進行學(xué)習(xí)的
- 家在哪兒
- 確定來北京嗎
- 有時間來實習(xí)嗎
總結(jié)
從上面看下來問的內(nèi)容比較多,但是面試問來問去還是那么點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己復(fù)習(xí)到了哪個階段就好。
本文摘自 :https://blog.51cto.com/u