2021大廠Android面試必問題目,農民工看完都會了
形成自己的面試知識體系
面試,簡單地說就是回答出更多的問題。而準備面試,自然就要掌握更多面試中可能問到的知識。為了方便系統地對知識點進行學習和複習,我覺得在準備階段形成一個自己的面試知識體系非常重要。並且,在學習過程中,你的體系要不斷地完善。各種零散的知識點是不方便系統地學習和複習的。
具體來說,大致過程如下:
-
整理面試需要掌握的知識點。可以通過 Github 和 部落格上別人整理的面試總結或者知識腦圖,結合自己的專案經歷和麵試經驗整理出一個面試涉及的知識體系。
-
結合自己的情況確定學習計劃。可以看著自己整理的知識體系,思考一下這兩個問題:“我掌握了哪些知識、掌握程度如何”、“需要學習哪些知識、優先順序如何”。
-
學習新的知識和鞏固自己擅長的知識。同時,不斷完善自己的知識體系。
在自己心中形成一個知識體系之後,不僅學習的時候更有針對性和計劃性,面試時心態也會好很多。另外寫簡歷和麵試時也可以用一些技巧,比如在對自己有一個明確的認識的前提下可以避開自己不擅長的知識點,突出自己擅長的知識點。
下面,我詳細分享一下我自己的面試知識體系。我的面試知識體系包括以下幾個部分:
- 知識點
- 專案
- 演算法
- 亮點
3.2.1 知識點
這裡說的知識點,指的是面試中基本不用思考,只需要知道就能回答的東西。下面是我自己的面試知識點體系,大家覺得不錯的話,可以參考一下:
- Android
- 四大元件、Fragment、Context
- 概述、生命週期、啟動
- 通訊方式以及一些細節,比如 Fragment 的 commitAllowingStateLoss等
- 程序間通訊
- Binder
- Binder 結合 AMS、WMS 等系統服務
- 四大元件的啟動過程
- Window 的理解
- View
- 事件體系、滑動衝突
- 測量佈局繪製流程
- ListView、RecyclerView 對比和快取機制
- invalidate、requestLayout 等重新整理方式
- SurfaceView 的原理
- 圖形顯示原理
- Choreographer 結合 View 重新整理
- VSYNC、雙緩衝、三緩衝
- SurfaceFlinger
- 訊息機制
- Handler、Looper、MessageQueue
- ThreadLocal
- 執行緒形態
- AsyncTask
- HandlerThread
- IntentService
- 記憶體洩漏
- 情況
- 分析
- 效能優化
- 常見的一些套路,比如佈局優化、記憶體洩漏優化、ListView/RecyclerView 優化、LruCache 等
- 可以結合圖形顯示原理和Handler機制擴充套件
- 大圖顯示
- 開源庫,這部分通常會考察原始碼的設計和實現
- EventBus
- Retrofit
- OkHttp
- 其他專案中用到的流行開源庫
- 其他
- Android 版本變更
- APK 打包、安裝過程
- Android 類載入,結合 Java 類載入
- Dalvik/ART,結合 Java 虛擬機器
- 程序保活、程序優先順序
- JNI,這塊不用掌握很深,大致原理知道就行
- SharePreferences 的原理和注意點
- Parcelable 與 Serializable
- WebView
- MultiDex
- 四大元件、Fragment、Context
- Java
- 語言
- 動態代理
- 型別資訊、反射
- 泛型
- 異常
- 容器,HashMap一定要看,其他的各種常見容器也都建議瞭解一下實現
- 常用容器:HashMap、LinkedHashMap、ArrayList、LinkedList等
- Android 容器:SparseArray 等
- 併發容器:ConcurrentHashMap、CopyOnWriteArrayList、阻塞佇列
- 併發
- 執行緒狀態
- 內建/顯式的鎖、條件佇列
- 死鎖
- 執行緒池
- volatile、原子變數、CAS、ABA
- 記憶體模型和 happens-before
- 虛擬機器
- 記憶體區域
- 物件記憶體分配
- 引用計數和可達性分析
- 垃圾收集演算法和垃圾收集器
- 語言
- 設計模式
- 常用設計模式,常考單例、模板、觀察者
- 原始碼中的設計模式
- MVC/MVP/MVVM
- 計算機基礎
- 計算機網路
- HTTP:請求、響應、快取、版本變化
- TCP/IP:握手揮手、流量控制、擁塞控制、廣播/組播等。
- 作業系統
- 程序和執行緒
- 虛擬記憶體、分頁和分段
- 資料庫
- 索引
- 事務和ACID
- 關係型和非關係型
- ORM和SQL
- 計算機網路
上面比較詳細地羅列了我準備的知識點。除了這些常見知識點外,還有些知識點是結合專案的,與專案相關的知識點也要看一下。
計算機基礎部分知識量很大,在短時間內很難深入學習,主要還是靠平時積累。但是這方面內容,對校招來說是很重要的,而且越是大廠越重視。比如我的面試中,阿里相比於美團和頭條,我能感覺到對計算機基礎的考察更加重視。非科班出身的我在研究生期間花了好多時間補計算機基礎,但依然沒有學得很深入,這塊我準備的點也不多。
知識點部分在面試中會佔到很大的比例。有時會直接問知識點,更多的情況是根據簡歷和專案引出一些問題考察知識點,然後基於當前問題不斷擴充套件。知識點的準備雖然範圍比較清晰,但是準備過程需要花費大量時間,死記硬背而不理解是不夠的。只有在深刻的理解之後,才能在面試中流暢地表達出來。
我自己的學習材料主要是書、原始碼和部落格。我一般先對某一塊知識找一兩本有名的書看,看書過程中要結合原始碼,對有疑問的或者書上沒講清楚的內容 Google 一些文章看。有了一兩本書的底子後,再將剩餘的知識點通過部落格查漏補缺。在這個過程中,一定會發現新的知識,知識點也會隨之增加。
針對知識點的學習,在明確了學習內容後,我推薦一些我看過或正在用的學習資源:
- 綜合,下面兩個整理是我面試前看的比較多的,非常不錯的資料。
- Android
- 《Android 開發藝術探索》:只要看這本即可,剩下的就看部落格和原始碼了。其他的書我還看過《第一行程式碼》、《Android 程式設計權威指南》、《Android 群英傳》,但都沒任主席這本書寫得好。這本書會穿插一些原始碼片段,講解了Android 開發中各種最基本的問題,這些問題也是面試中的熱點。建議看的時候結合原始碼。另外書中內容基於 Android 5.0,有點久了,要注意版本問題。
- AndroidXRef:這個網站可以查各個版本的原始碼,養成看原始碼的習慣很重要。
- Java
- 《深入理解 Java 虛擬機器》:面試常考這本書的前三章。
- 《Java 併發程式設計實戰》:我非常喜歡的書,全面介紹了Java併發框架的使用方式和實現思想。程式碼不多,重在闡述思想。本書內容到 JDK1.6,不過對面試來說夠了。
- JDK原始碼:可以看 src.zip、編譯好的 OpenJDK 原始碼或者 GitHub 上的原始碼倉庫。需要注意版本區別。
- 計算機網路,下面兩本書都比較薄,看了之後再看一些網上的整理,面試基本上沒問題了。
- 《圖解 TCP/IP》
- 《圖解 HTTP》
- 作業系統
- 《深入理解計算機系統》:這本書很厚,但是真的非常好,講得非常底層。掌握這本書的內容在校招面試中我覺得是很有競爭力的。在平時看比較適合。
設計模式部分,我沒有系統地看過書,只在網上學過,就不給大家推薦資源了。我覺得設計模式主要是理解常用設計模式的思想,知道他們在原始碼中有哪些應用。
另外,學習知識點的時候要兼顧深度和廣度,廣度我覺得基本覆蓋主要的知識點就行,但深度是越深越好。理解得越深、越底層,越能在面試中更勝一籌。同時也能展現出自己的學習能力,學習能力是校招面試非常重視的。
3.2.2 專案
專案部分,我會先理一下專案整體架構,然後看一遍專案原始碼中自己的部分,最後整理出如下內容:
- 專案背景
- 架構
- 技術點
- 疑難問題
- 優化點
- 用到的設計模式
上述內容除了專案背景外,都是面試中經常會問到的內容。整理過程中,我的方式是將內容寫在紙上。這種方式有助於方便地進行日常複習和麵試前快速複習。頭兩次面試前,我都看了自己整理的專案內容。後面面試多了以後,對自己的專案中可以說的內容自然也會非常熟悉了。
另外,建議邊整理專案,邊考慮一下相關的知識點。非常有必要對相關的知識點做一下準備,特別是用到的主流開源庫。面試中,網路庫是最常被問到的。
3.2.3 演算法
不管哪個公司,演算法都是面試中必考的一部分。我在美團和頭條的面試過程中,每一輪技術面都考了我一到兩道手寫演算法題。難度上,都挺簡單的,但是一定要注意寫的對不對、規不規範。我一般會先跟面試官說一下我的思路再寫。
我在演算法準備過程中,主要完成了下面幾部分準備:
- 理論學習:這塊我是看了一遍《資料結構與演算法分析:C語言描述》,這本書雖然薄,但是講得不大好理解,所以看起來非常慢。我還是建議看《演算法》或者在刷題時邊刷邊學。
- 資料結構:對面試來說,只要理解陣列、連結串列、二叉樹、散列表、圖這幾種資料結構就夠了。而且這些結構中一般不會問跳躍表、伸展樹、紅黑樹等稍微複雜點的資料結構。
- 演算法思想:DP、BFS、DFS、回溯、貪婪、分治。其中,DP考的概率應該是最大的。
- 查詢:二分查詢。
- 排序:各種排序演算法的思想、實現、複雜度、穩定性都是面試中常考的內容。
- 揹包問題:除0/1揹包問題外有很多變種,面試和測評時我碰到過兩次揹包問題,可以看一下。
- 刷題:我的方式是刷 LeetCode 各種型別的流行題,推薦一個清單。《劍指 Offer》我刷了兩遍,面試前還會拿出來看看,很多題都很可能被問到。
- 整理常見演算法題:我自己整理了揹包、各種排序以及連結串列和二叉樹的常見問題的Java實現,並且在不斷擴充,在面試前也可以用來快速複習。
除了正常的演算法題之外,我和一些同學都被問過智力題。智力題也是面試官可能會問的一種題型。比如,過河問題在我們實驗室同學的面試中,出現了不止一次。然後,阿里的演算法題問的比較靈活,經常會通過一個場景來考,不是 LeetCode 或《劍指 Offer》上常見的那種題目。比如,我阿里一面中的一個問題:“老闆有 2000 元給我和同學分錢,首先由我提出分錢方案。如果同學不同意,則總額變為 1000 元,並由同學提出分錢方案。如果這時我不同意,則倆人各拿 100 元。請問一開始我應該怎麼給出分錢方案?”。還有我阿里三面中的一個問題:“在一個手機螢幕上有兩列(類似於瀑布流),給你一些高度不同的 item,怎麼擺放才能讓這兩列的整體高度最小?”。
3.2.4 亮點
亮點通常是一些可以深入的點或者比較底層的知識點,面試中亮出來經常會有很好的效果。可以有意準備一些點。比如,我在美團和頭條的面試中面試官都因為我對圖形顯示原理、SurfaceFlinger 這塊內容的理解而表揚了我,認可了我的學習能力。
另外,從我和我同學的面試經驗看,如果對 C++ 很瞭解或者有專案經驗的話,是很加分的。一方面 C++ 是比 Java 更接近底層的語言,另一方面 NDK 開發現在也越來越重要。
4. 面試技巧
4.1 引導面試官
在對自己的知識體系很清楚的前提下,可以適當地引導面試官以達到揚長避短的目的。
最直接的方法就是簡歷。面試官一般都會從簡歷開始問起,所以簡歷上的內容直接影響了面試走向。所以在寫簡歷時,最好在對自己的知識體系有一個清晰的認識之後,揚長避短地寫。
主動深入和擴充套件是我在面試中引導面試官的常用方式。一般面試官問一個問題,我會由淺入深地回答,然後儘量講得深、講得底層,講得差不多了就主動將話題切換到一個自己擅長的相關的話題上。比如 Android 中 應用與AMS間的通訊、螢幕重新整理等很多內容都能引到 Handler 上。這時候,之前準備的“亮點”就可以排上用場了。
4.2 表現出自己的好學
除了學習能力,對學習的熱情感覺面試官也很看重。不管是在技術面還是 HR 面中,表現自己對技術的追求都是不會錯的。當然,這個還是要建立在自己真的喜歡某種技術的基礎上。
可以通過以下幾種方式表現出自己的好學:
- 表現出自己對知識點的鑽研。這就需要引導面試官了。
- 表現自己對新技術的關注。可以主動提一些新技術和自己對某一技術未來發展趨勢的理解。比如我在阿里二面時講到 Google 新的開發框架 Flutter。
- 說明自己看過哪些書、對哪些東西深入研究過。
4.3 遇到不會的問題
這種情況我也不能說我做的很好,不過我在這裡分享一下我遇到不會的問題時是怎麼做的。
首先,我一般會主動說:“這方面內容我沒有深入研究過,我只能說一些比較淺顯的或者使用上的東西”。因為一開始就跟面試官說明自己的理解程度可以讓面試官心中有數,一般就不會再刻意刁難了,比起後面回答不上來,這是更好的方式。也表現出了自己的誠實。
然後,我會繼續說:“如果讓我來做的話,我會……”。因為說出自己的方案肯定比什麼都不說好,甚至可以借題發揮,講到自己擅長的知識點上去。
最後
簡歷首選內推方式,速度快,效率高啊!然後可以在拉鉤,boss,脈脈,大街上看看。簡歷上寫道熟悉什麼技術就一定要去熟悉它,不然被問到不會很尷尬!做過什麼專案,即使專案體量不大,但也一定要熟悉實現原理!不是你負責的部分,也可以看看同事是怎麼實現的,換你來做你會怎麼做?做過什麼,會什麼是廣度問題,取決於專案內容。但做過什麼,達到怎樣一個境界,這是深度問題,和個人學習能力和解決問題的態度有關了。大公司看深度,小公司看廣度。大公司面試你會的,小公司面試他們用到的你會不會,也就是崗位匹配度。
選定你想去的幾家公司後,先去一些小的公司練練,學習下面試技巧,總結下,也算是熟悉下面試氛圍,平時和同事或者產品PK時可以講得頭頭是道,思路清晰至極,到了現場真的不一樣,怎麼描述你所做的一切,這絕對是個學術性問題!
面試過程一定要有禮貌!即使你覺得面試官不尊重你,經常打斷你的講解,或者你覺得他不如你,問的問題缺乏專業水平,你也一定要尊重他,誰叫現在是他選擇你,等你拿到offer後就是你選擇他了。
金九銀十面試季,跳槽季,整理面試題已經成了我多年的習慣!在這裡我和身邊一些朋友特意整理了一份快速進階為Android高階工程師的系統且全面的學習資料。涵蓋了Android初級——Android高階架構師進階必備的一些學習技能。
附上:我們之前因為秋招收集的二十套一二線網際網路公司Android面試真題(含BAT、小米、華為、美團、滴滴)和我自己整理Android複習筆記(包含Android基礎知識點、Android擴充套件知識點、Android原始碼解析、設計模式彙總、Gradle知識點、常見演算法題彙總。)