1. 前言
本文從面試準備、面試技巧等方面分享一些個人經(jīng)驗。希望能給大家?guī)韼椭?/p>
2.面試情況
阿里(螞蟻金服):拿到 offer
頭條(抖音、火山):拿到 offer
美團(美團平臺):拿到 offer
騰訊(騰訊音樂):二面掛
3. 準備
這部分將結(jié)合我自己的經(jīng)驗,為大家準備面試提供一個參考。
3.1 盡早開始準備
首先,盡早開始準備。足夠的時間是充足的準備的基本保證。不用擔心因為早準備而遺忘的問題,因為每一次看都會比上一次看快很多。隨著復習次數(shù)增加,對知識點的掌握也會更加牢固。我一些同學到面試前一個月甚至前幾天才準備,這時再想準備好龐大的知識點就力不從心了,自然面試結(jié)果也不好。因此,一定要盡早開始準備,一定要盡早開始準備,一定要盡早開始準備。我是在面試前半年左右時開始系統(tǒng)地準備,那時其實已經(jīng)有點晚了。
3.2 形成自己的面試知識體系
面試,簡單地說就是回答出更多的問題。而準備面試,自然就要掌握更多面試中可能問到的知識。為了方便系統(tǒng)地對知識點進行學習和復習,我覺得在準備階段形成一個自己的面試知識體系非常重要。并且,在學習過程中,你的體系要不斷地完善。各種零散的知識點是不方便系統(tǒng)地學習和復習的。
具體來說,大致過程如下:
整理面試需要掌握的知識點??梢酝ㄟ^ Github 和 博客上別人整理的面試總結(jié)或者知識腦圖,結(jié)合自己的項目經(jīng)歷和面試經(jīng)驗整理出一個面試涉及的知識體系。
結(jié)合自己的情況確定學習計劃??梢钥粗约赫淼闹R體系,思考一下這兩個問題:“我掌握了哪些知識、掌握程度如何”、“需要學習哪些知識、優(yōu)先級如何”。
學習新的知識和鞏固自己擅長的知識。同時,不斷完善自己的知識體系。
在自己心中形成一個知識體系之后,不僅學習的時候更有針對性和計劃性,面試時心態(tài)也會好很多。另外寫簡歷和面試時也可以用一些技巧,比如在對自己有一個明確的認識的前提下可以避開自己不擅長的知識點,突出自己擅長的知識點。
下面,我詳細分享一下我自己的面試知識體系。我的面試知識體系包括以下幾個部分:
- 知識點
- 項目
- 算法
- 亮點
3.2.1 知識點
這里說的知識點,指的是面試中基本不用思考,只需要知道就能回答的東西。下面是我自己的面試知識點體系,大家覺得不錯的話,可以參考一下:
-
Android
-四大組件、Fragment、Context- 概述、生命周期、啟動
- 通信方式以及一些細節(jié),比如 Fragment 的 commitAllowingStateLoss等
-進程間通信
- Binder
- Binder 結(jié)合 AMS、WMS 等系統(tǒng)服務
- 四大組件的啟動過程
- Window 的理解
-View
- 事件體系、滑動沖突
- 測量布局繪制流程
- ListView、RecyclerView 對比和緩存機制
- invalidate、requestLayout 等刷新方式
- SurfaceView 的原理
-圖形顯示原理
- Choreographer 結(jié)合 View 刷新
- VSYNC、雙緩沖、三緩沖
- SurfaceFlinger
-消息機制
- Handler、Looper、MessageQueue
- ThreadLocal
-線程形態(tài)
- AsyncTask
- HandlerThread
- IntentService
-內(nèi)存泄漏
- 情況
- 分析
-性能優(yōu)化
- 常見的一些套路,比如布局優(yōu)化、內(nèi)存泄漏優(yōu)化、ListView/RecyclerView 優(yōu)化、LruCache 等
- 可以結(jié)合圖形顯示原理和Handler機制擴展
- 大圖顯示
-開源庫,這部分通常會考察源碼的設(shè)計和實現(xiàn)
- EventBus
- Retrofit
- OkHttp
- 其他項目中用到的流行開源庫
-其他
- Android 版本變更
- APK 打包、安裝過程
- Android 類加載,結(jié)合 Java 類加載
- Dalvik/ART,結(jié)合 Java 虛擬機
- 進程?;睢⑦M程優(yōu)先級
- JNI,這塊不用掌握很深,大致原理知道就行
- SharePreferences 的原理和注意點
- Parcelable 與 Serializable
- WebView
- MultiDex
-
Java
-語言
- 動態(tài)代理
- 類型信息、反射
- 泛型
- 異常
-容器,HashMap一定要看,其他的各種常見容器也都建議了解一下實現(xiàn)
- 常用容器:HashMap、LinkedHashMap、ArrayList、LinkedList等
- Android 容器:SparseArray 等
- 并發(fā)容器:ConcurrentHashMap、CopyOnWriteArrayList、阻塞隊列
-并發(fā)
- 線程狀態(tài)
- 內(nèi)置/顯式的鎖、條件隊列
- 死鎖
- 線程池
- volatile、原子變量、CAS、ABA
- 內(nèi)存模型和 happens-before
-虛擬機
- 內(nèi)存區(qū)域
- 對象內(nèi)存分配
- 引用計數(shù)和可達性分析
- 垃圾收集算法和垃圾收集器
設(shè)計模式
-常用設(shè)計模式,??紗卫?、模板、觀察者
-源碼中的設(shè)計模式
-MVC/MVP/MVVM-
計算機基礎(chǔ)
-計算機網(wǎng)絡- HTTP:請求、響應、緩存、版本變化
- TCP/IP:握手揮手、流量控制、擁塞控制、廣播/組播等。
-操作系統(tǒng)
- 進程和線程
- 虛擬內(nèi)存、分頁和分段
-數(shù)據(jù)庫
- 索引
- 事務和ACID
- 關(guān)系型和非關(guān)系型
- ORM和SQL
上面比較詳細地羅列了我準備的知識點。除了這些常見知識點外,還有些知識點是結(jié)合項目的,與項目相關(guān)的知識點也要看一下。
計算機基礎(chǔ)部分知識量很大,在短時間內(nèi)很難深入學習,主要還是靠平時積累。但是這方面內(nèi)容,對校招來說是很重要的,而且越是大廠越重視。比如我的面試中,阿里相比于美團和頭條,我能感覺到對計算機基礎(chǔ)的考察更加重視。非科班出身的我在研究生期間花了好多時間補計算機基礎(chǔ),但依然沒有學得很深入,這塊我準備的點也不多。
知識點部分在面試中會占到很大的比例。有時會直接問知識點,更多的情況是根據(jù)簡歷和項目引出一些問題考察知識點,然后基于當前問題不斷擴展。知識點的準備雖然范圍比較清晰,但是準備過程需要花費大量時間,死記硬背而不理解是不夠的。只有在深刻的理解之后,才能在面試中流暢地表達出來。
我自己的學習材料主要是書、源碼和博客。我一般先對某一塊知識找一兩本有名的書看,看書過程中要結(jié)合源碼,對有疑問的或者書上沒講清楚的內(nèi)容 Google 一些文章看。有了一兩本書的底子后,再將剩余的知識點通過博客查漏補缺。在這個過程中,一定會發(fā)現(xiàn)新的知識,知識點也會隨之增加。
針對知識點的學習,在明確了學習內(nèi)容后,我推薦一些我看過或正在用的學習資源:
-
綜合,下面兩個整理是我面試前看的比較多的,非常不錯的資料。
-
Android
- 《Android 開發(fā)藝術(shù)探索》:只要看這本即可,剩下的就看博客和源碼了。其他的書我還看過《第一行代碼》、《Android 編程權(quán)威指南》、《Android 群英傳》,但都沒任主席這本書寫得好。這本書會穿插一些源碼片段,講解了Android 開發(fā)中各種最基本的問題,這些問題也是面試中的熱點。建議看的時候結(jié)合源碼。另外書中內(nèi)容基于 Android 5.0,有點久了,要注意版本問題。
- AndroidXRef:這個網(wǎng)站可以查各個版本的源碼,養(yǎng)成看源碼的習慣很重要。
-
Java
- 《深入理解 Java 虛擬機》:面試??歼@本書的前三章。
- 《Java 并發(fā)編程實戰(zhàn)》:我非常喜歡的書,全面介紹了Java并發(fā)框架的使用方式和實現(xiàn)思想。代碼不多,重在闡述思想。本書內(nèi)容到 JDK1.6,不過對面試來說夠了。
- JDK源碼:可以看 src.zip、編譯好的 OpenJDK 源碼或者 GitHub 上的源碼倉庫。需要注意版本區(qū)別。
-
計算機網(wǎng)絡,下面兩本書都比較薄,看了之后再看一些網(wǎng)上的整理,面試基本上沒問題了。
- 《圖解 TCP/IP》
- 《圖解 HTTP》
-
操作系統(tǒng)
- 《深入理解計算機系統(tǒng)》:這本書很厚,但是真的非常好,講得非常底層。掌握這本書的內(nèi)容在校招面試中我覺得是很有競爭力的。在平時看比較適合。
設(shè)計模式部分,我沒有系統(tǒng)地看過書,只在網(wǎng)上學過,就不給大家推薦資源了。我覺得設(shè)計模式主要是理解常用設(shè)計模式的思想,知道他們在源碼中有哪些應用。
另外,學習知識點的時候要兼顧深度和廣度,廣度我覺得基本覆蓋主要的知識點就行,但深度是越深越好。理解得越深、越底層,越能在面試中更勝一籌。同時也能展現(xiàn)出自己的學習能力,學習能力是校招面試非常重視的。
3.2.2 項目
項目部分,我會先理一下項目整體架構(gòu),然后看一遍項目源碼中自己的部分,最后整理出如下內(nèi)容:
- 項目背景
- 架構(gòu)
- 技術(shù)點
- 疑難問題
- 優(yōu)化點
- 用到的設(shè)計模式
上述內(nèi)容除了項目背景外,都是面試中經(jīng)常會問到的內(nèi)容。整理過程中,我的方式是將內(nèi)容寫在紙上。這種方式有助于方便地進行日常復習和面試前快速復習。頭兩次面試前,我都看了自己整理的項目內(nèi)容。后面面試多了以后,對自己的項目中可以說的內(nèi)容自然也會非常熟悉了。
另外,建議邊整理項目,邊考慮一下相關(guān)的知識點。非常有必要對相關(guān)的知識點做一下準備,特別是用到的主流開源庫。面試中,網(wǎng)絡庫是最常被問到的。
3.2.3 算法
不管哪個公司,算法都是面試中必考的一部分。我在美團和頭條的面試過程中,每一輪技術(shù)面都考了我一到兩道手寫算法題。難度上,都挺簡單的,但是一定要注意寫的對不對、規(guī)不規(guī)范。我一般會先跟面試官說一下我的思路再寫。
我在算法準備過程中,主要完成了下面幾部分準備:
-
理論學習:這塊我是看了一遍《數(shù)據(jù)結(jié)構(gòu)與算法分析:C語言描述》,這本書雖然薄,但是講得不大好理解,所以看起來非常慢。我還是建議看《算法》或者在刷題時邊刷邊學。
- 數(shù)據(jù)結(jié)構(gòu):對面試來說,只要理解數(shù)組、鏈表、二叉樹、散列表、圖這幾種數(shù)據(jù)結(jié)構(gòu)就夠了。而且這些結(jié)構(gòu)中一般不會問跳躍表、伸展樹、紅黑樹等稍微復雜點的數(shù)據(jù)結(jié)構(gòu)。
- 算法思想:DP、BFS、DFS、回溯、貪婪、分治。其中,DP考的概率應該是最大的。
- 查找:二分查找。
- 排序:各種排序算法的思想、實現(xiàn)、復雜度、穩(wěn)定性都是面試中??嫉膬?nèi)容。
- 背包問題:除0/1背包問題外有很多變種,面試和測評時我碰到過兩次背包問題,可以看一下。
刷題:我的方式是刷 LeetCode 各種類型的流行題,推薦一個清單。《劍指 Offer》我刷了兩遍,面試前還會拿出來看看,很多題都很可能被問到。
整理常見算法題:我自己整理了背包、各種排序以及鏈表和二叉樹的常見問題的Java實現(xiàn),并且在不斷擴充,在面試前也可以用來快速復習。這個是我的整理。
除了正常的算法題之外,我和一些同學都被問過智力題。智力題也是面試官可能會問的一種題型。比如,過河問題在我們實驗室同學的面試中,出現(xiàn)了不止一次。然后,阿里的算法題問的比較靈活,經(jīng)常會通過一個場景來考,不是 LeetCode 或《劍指 Offer》上常見的那種題目。比如,我阿里一面中的一個問題:“老板有 2000 元給我和同學分錢,首先由我提出分錢方案。如果同學不同意,則總額變?yōu)?1000 元,并由同學提出分錢方案。如果這時我不同意,則倆人各拿 100 元。請問一開始我應該怎么給出分錢方案?”。還有我阿里三面中的一個問題:“在一個手機屏幕上有兩列(類似于瀑布流),給你一些高度不同的 item,怎么擺放才能讓這兩列的整體高度最???”。
3.2.4 亮點
亮點通常是一些可以深入的點或者比較底層的知識點,面試中亮出來經(jīng)常會有很好的效果??梢杂幸鉁蕚湟恍c。比如,我在美團和頭條的面試中面試官都因為我對圖形顯示原理、SurfaceFlinger 這塊內(nèi)容的理解而表揚了我,認可了我的學習能力。
另外,從我和我同學的面試經(jīng)驗看,如果對 C++ 很了解或者有項目經(jīng)驗的話,是很加分的。一方面 C++ 是比 Java 更接近底層的語言,另一方面 NDK 開發(fā)現(xiàn)在也越來越重要。
4. 面試技巧
4.1 引導面試官
在對自己的知識體系很清楚的前提下,可以適當?shù)匾龑嬖嚬僖赃_到揚長避短的目的。
最直接的方法就是簡歷。面試官一般都會從簡歷開始問起,所以簡歷上的內(nèi)容直接影響了面試走向。所以在寫簡歷時,最好在對自己的知識體系有一個清晰的認識之后,揚長避短地寫。
主動深入和擴展是我在面試中引導面試官的常用方式。一般面試官問一個問題,我會由淺入深地回答,然后盡量講得深、講得底層,講得差不多了就主動將話題切換到一個自己擅長的相關(guān)的話題上。比如 Android 中 應用與AMS間的通信、屏幕刷新等很多內(nèi)容都能引到 Handler 上。這時候,之前準備的“亮點”就可以排上用場了。
4.2 表現(xiàn)出自己的好學
除了學習能力,對學習的熱情感覺面試官也很看重。不管是在技術(shù)面還是 HR 面中,表現(xiàn)自己對技術(shù)的追求都是不會錯的。當然,這個還是要建立在自己真的喜歡某種技術(shù)的基礎(chǔ)上。
可以通過以下幾種方式表現(xiàn)出自己的好學:
- 表現(xiàn)出自己對知識點的鉆研。這就需要引導面試官了。
- 表現(xiàn)自己對新技術(shù)的關(guān)注??梢灾鲃犹嵋恍┬录夹g(shù)和自己對某一技術(shù)未來發(fā)展趨勢的理解。比如我在阿里二面時講到 Google 新的開發(fā)框架 Flutter。
- 說明自己看過哪些書、對哪些東西深入研究過。
4.3 遇到不會的問題
這種情況我也不能說我做的很好,不過我在這里分享一下我遇到不會的問題時是怎么做的。
首先,我一般會主動說:“這方面內(nèi)容我沒有深入研究過,我只能說一些比較淺顯的或者使用上的東西”。因為一開始就跟面試官說明自己的理解程度可以讓面試官心中有數(shù),一般就不會再刻意刁難了,比起后面回答不上來,這是更好的方式。也表現(xiàn)出了自己的誠實。
然后,我會繼續(xù)說:“如果讓我來做的話,我會……”。因為說出自己的方案肯定比什么都不說好,甚至可以借題發(fā)揮,講到自己擅長的知識點上去。
最后,不懂裝懂是最不好的。
5. 總結(jié)
拿到心儀的 offer 需要系統(tǒng)和漫長的準備,也需要一定的面試技巧。本文分享了我這次實習生招聘中準備和面試的一些經(jīng)驗,也介紹了我對暑期實習生招聘的一些了解。最后,祝大家都能找到自己滿意的實習或者工作!

想學習更多Android知識,或者獲取相關(guān)資料請查看我主頁 有面試資源系統(tǒng)整理分享,Java語言進階和Kotlin語言與Android相關(guān)技術(shù)內(nèi)核,APP開發(fā)框架知識, 360°Android App全方位性能優(yōu)化。Android前沿技術(shù),高級UI、Gradle、RxJava、小程序、Hybrid、 移動架構(gòu)師專題項目實戰(zhàn)環(huán)節(jié)、React Native、等技術(shù)教程!架構(gòu)師課程、NDK模塊開發(fā)、 Flutter等全方面的 Android高級實踐技術(shù)講解。還有在線答疑