網際網路寒冬下,一個 Android 程式設計師的面試心得
回顧一下自己這段時間的經歷,九月份的時候,公司通知了裁員,我匆匆忙忙地出去面了幾家,但最終都沒有拿到offer,我感覺今年的寒冬有點冷。到十二月份,公司開始第二波裁員,我決定主動拿賠償走人。後續的面試過程我做了一些準備,基本都能走到hr面,後面我也順利地拿到了offer,我給大家分享下我的求職體會,希望能給大家一些參考。
一般Android面試分為兩部分:Java部分和Android部分,下面說一下自己面試過程遇到的一些具體題目和一些相關知識點。
一 JAVA相關
1)JAVA基礎
1.java基本資料型別有哪些,int, long佔幾個位元組
2.== 和 equals有什麼區別
3.hashcode 和 equals作用
4.new String建立了幾個物件
5.位運算子的一些計算
6.java的拆裝箱
7.compareable 和 compartor的區別
下面列一兩個遇到的題吧

image.png

image.png

image.png
它的列印結果是什麼。
類似這種的題很多,考察的都是基礎知識的牢固性。所以需要自己多鞏固基礎。
2)資料結構和演算法
常見的資料結構就是:陣列,棧,佇列,集合,對映,連結串列,堆,二分搜尋樹,紅黑樹。當然還有其他的一些,比如AVL平衡樹等一些資料結構。
我們要做的就是了解它們的實現原理和各自的優缺點。
資料結構部分面試遇到最多的就是:
1.ArrayList和LinkedList的區別,優缺點
2.hashmap實現,擴容是怎麼做的,怎麼處理hash衝突,hashcode演算法等
3.連結串列需要知道。LinkedHashMap一般再問LRU的時候會問到
4.二分搜尋樹的特性和原理。前中後序遍歷寫出其中一種,當問到二分搜尋樹的缺點的時候,你需要提出基於二分搜尋樹的紅黑樹,說出他的特性。
5.堆的實現,最大堆,最小堆,優先佇列原理。
演算法
演算法其實就是我們平時常見的一些排序:選擇排序,插入排序,氣泡排序,希爾排序,歸併排序,快速排序。以及和資料結構相關聯的解決部分問題的一些計算方法。
演算法面試遇到的一些題:
1.手寫快速排序,插入排序,氣泡排序
2.翻轉一個數字
3.翻轉一個連結串列
4.O(n)複雜度找出陣列中和是9的兩個數的索引
5.寫出二分搜尋樹前中後序遍歷中的其中一個
6.實現一個佇列,並能記錄佇列中最大的數。
演算法這一塊是需要練習的推薦去Leetcode上面刷刷題,開拓一下思維。演算法也並不一定要求你能寫出來,主要考察你的思路,已經如何優化你的演算法。
3)JVM虛擬機器
JVM虛擬機器我們需要知道他們內部組成:堆,虛擬機器棧,本地方法棧,方法區,計數器。每一塊都存放什麼東西,以及垃圾回收的時候主要回收哪些塊的東西。GC-ROOT鏈是從哪些地方開始的,垃圾回收集演算法(很少遇到問的)。
類載入ClassLoader已經雙親委派機制,類載入的過程,類載入的資訊對應在JVM的哪些塊中。
列一個遇到的類載入的面試題:
public class TestClassLoader {
static class Father { public static final String TAG = "Father"; static { System.out.println("static Father"); } { System.out.println("unStatic Father"); } public Father() { System.out.println("constract Father"); method(); } public void method() { System.out.println("method Father"); } @Override public String toString() { return "toString Father"; } } static class Son extends Father { public static Son instance = new Son(); static { System.out.println("static Son"); } { System.out.println("unStatic Son"); } public Son() { System.out.println("constract Son"); method(); } public void method() { System.out.println("method Son"); } @Override public String toString() { return "toString Son"; } } public static void main(String[] args) { System.out.println("1.---------------------"); System.out.println(Son.TAG); Son[] sons = new Son[10]; System.out.println(sons); System.out.println("2.---------------------"); System.out.println(Son.instance); System.out.println("3.---------------------"); Son son = new Son(); Father father = son; father.method(); System.out.println(son); }
}
寫出列印輸出。
加一個小插曲:上面的題是餓了嗎面試問到的。面試我的人自己說是17年北航畢業的研究生。說自己非常注重基礎,全程問了很多JAVA基礎,包括上面的類載入的題,很自豪的說這個題是他自己出的。還有Collections下面的子類都有哪些,都有什麼不同。但是Android相關的題目問的水平很一般,說這個沒有嘲諷的意思。想說的是有些面試從一開始就註定了你可能進不了這個公司。面試有的時候也是要看眼緣的。不要灰心,找出自己的不足,補齊它,繼續前行。還有就是上面那個題,的確很不錯。
4)執行緒安全
當多個執行緒訪問一個物件的時候,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為都可以獲取正確的結果,我們就認為這個物件時執行緒安全的。
執行緒安全就是一些多執行緒下載,同步,鎖,死鎖,執行緒池。volatile關鍵字的特性,變數的原子性。以及java.util.concurrent包下的類,也需要了解一下。
一般會問的是手寫單例,以及雙重鎖式單例的優點。還有就是讓你自己實現一個多執行緒下載,看你怎麼設計。
5)程式設計思想
封裝,繼承,多型,抽象,反射,註解,設計模式,設計模式的原則。
面試中一般會問下:
1.抽象和介面有什麼不一樣
2.工作中常用的設計模式,一些原始碼中的設計模式
3.具體給你一個設計模式讓你說說你對他的瞭解,比如觀察者,工廠。
以上這些東西主要考察你的程式碼設計能力。
6)網路協議
1.網際網路的實現主要分為幾層,http、ftp、tcp、ip分別位於哪一層。
2.http和https的區別
3.為什麼tcp要經過三次握手,四次揮手
4.socket瞭解過嗎
一般http和https問的比較多,對稱加密和非對稱加密也會問。tcp和socket偶爾遇見問的。
二 JAVA部分總結
我覺得JAVA部分大致上可以分為這幾大塊,細想一套程式碼,其實就是類和組合這些類,怎麼組合其實就是設計模式。而類裡面包含的其實就是基本資料型別和一些資料機構來存放這些基本資料型別或者類,然後就是JVM去怎麼載入這些類。針對上面幾個部分我推薦幾本書吧:
《JAVA程式設計思想》
《深入理解JAVA虛擬機器 第二版》
《大話設計模式》
《HeadFirst設計模式》
《資料結構和演算法》
《圖解HTTP》
資料結構和演算法重點推薦: https://github.com/wangxp423/ExerciseJava 以及readme中提到的劉宇波(liuyubobobo)他開源的程式碼和文件。他在慕課網錄製了四套視訊來講解資料結構和演算法。文件通俗易懂。很適合初學者,和想系統瞭解的人。
在這由於文字很多,我總結了Android面試所涉及到的常問範圍及常問面試題免費分享給大家,文末有領取!
三 Android相關
Android部分我就不分幾大塊了。直接列舉,但是列舉到的每一項都是面試經常會問到並且會延伸問的,所以需要深入的去研究。
1.四大元件有哪些,說出你對他們在Android系統中的作用和理解。
2.Activity生命週期,A啟動B兩個頁面生命週期怎麼執行的,為什麼會 這樣,生命週期為什麼這麼設計,你有了解過嗎。
3.四種啟動模式,內部堆疊是怎麼回事,你工作中怎麼使用的。
4.Activity的啟動過程,這個我強烈建議每個Android開發人員都要清楚的知道,並且跟一下原始碼,幾個核心類的作用。你會對Android有一個更好的認識。
5.事件分發流程,怎麼處理滑動衝突。舉例:長按ListView的一個Item它變灰了。這個時候在滑動。item恢復原來的樣子,這個時候他們內部的事件傳遞是什麼樣子。有很多種問法,所以你一定要搞清楚。
6.自定義View,View的繪製流程。onMeasure,onLayout,onDraw都是什麼作用。ViewGroup是怎麼分發繪製的。onDraw裡面怎麼去做繪製,Canvas,Path,Paint你都需要了解。並且配合ValueAnimtor或者Scroller去實現動畫。有時候面試的會突發奇想問你ViewGroup是樹形結構,我想知道樹的深度,你怎麼計算,突然就變成了一個數據結構和演算法的題。
7.Bitmap和Drawable
8.Animation和Animator
9.LinearLayout、RelativeLayout、FrameLayout三種常用佈局的特性,他在佈局的時候是怎麼計算的。效率如何。CoordinatorLayout配合AppbarLayout的使用,以及自定義Behavior。ConstraintLayout的使用。用來減少層級。
10.Handler訊息機制,推薦看一下Looper的原始碼
11.程序間通訊,Binder機制
12.AsyncTask原始碼看一下。
13.圖片的壓縮處理,三級快取,Lru演算法
14.解析度和螢幕密度,以及計算一個圖片大小。mdpi,hdpi的關係和比例。
15.優化,記憶體優化,佈局優化,啟動優化,效能優化。記憶體洩露,記憶體溢位。怎麼優化,用了什麼工具,具體怎麼做的。
16.listView和RecycleView對比,以及快取策略。
17.JNI(很少問)
18.MVC,MVP,MVVM
19.開源框架Okhttp,Glide,EventBus,Rxjava等,以及JetPack下的開源庫,要會用,還說說出一些東西,推薦 Retrofit,Okhttp,Glide,EventBus這些看一下原始碼。
20.RecyclerView四大塊,能實現什麼效果,大致怎麼實現的,心裡要有數
21.DecorView,Window,WindowManager,PhoneWindow關係,以及個子的職責。
加分項:Kotlin,Gradle,Flutter,元件化,外掛化,熱修復。
四 Android相關總結
上面的列的相關內容,看似很短一句話,但是每一項都需要你深入的去研究,要了解原理,最好去看一下原始碼實現。當然還有一些是我沒寫到的,可能是我寫的時候沒有想起來,並不代表他們不重要,你也需要重視,再來一波推薦:
《Android開發藝術探索》強烈推薦,建議細細的讀,如果粗心大意建議讀兩到三遍,針對性的讀。
《Android進階之光》
《高階Android開發強化實戰》
《Android元件化架構》
《Android熱修復技術原理》
《Android外掛化開發指南》
五 面試心得
1.準備要充分,知識面要儘量的廣,同時深度也要夠。
2.面試安排上,如果不著急,儘量給自己留多時間,兩天一家,及時做總結和補充。
3.心態要放平,當做一次技術交流,面試要看一部分的運氣,也要看一些眼緣,有的面試官一張嘴你就能感覺到你這次面試完了。想去的公司沒有面試好,不要氣餒,繼續加油準備。
4.簡歷投遞方面,拉勾上投了很多經常不匹配,可能是我學歷問題(自考本),有一些打擊自信心,如果有同樣感受的,不妨換BOSS或者其他平臺。避免打擊自信心。
5.寫簡歷一定要體現自己的優勢,最好能體現類似於,用到了什麼技術,解決了什麼問題。簡歷上寫到的一定要胸有成竹。
6.類似於你的優勢是什麼,你覺得你專案中做的比較好的地方有哪些,你能給公司帶來什麼,這種問題心裡要先想一些,免得臨場發揮容易緊張說不好。
7.我所經歷的面試,一般技術面最少是兩輪。如果一輪後讓你走了,而你還自我感覺良好,那我覺得你有必要回顧一下面試內容,並一條一條找找該問題的相關內容,大部分問題就在於你沒有答到點子上,可能是深度不夠,也可能是擴充套件不夠。繼續加油。
六 閒聊
現在外面面試問的的確比較多,要求也挺高的,行情不好,薪資也不好要,所以心態一定要放好,找好自己的定位,心態一定要好。
面試之後要儘量做到總結,從我最開始沒什麼準備就出去面試,被打擊一通之後,總結了七八家面試題,會發新面試問到的都是那些知識點,可能角度不一樣,但是你只要深度夠,他怎麼問,你基於原理來回答,基本上都沒差,從簽了賠償協議以後出來面試,連續四家公司都走到了HR面,可以說面試的感覺上來了。前面的總結積累終究沒有白費。
在寫這篇文章之前,我專門看了下我之前收藏的別的公號上發的面試題,很全,我都有點不想寫這篇文章了。但是想了下我這三個月聽到要裁員開始面試,到第一批沒被裁,第二批裁員遲遲不來。到第二批來的時候主動申請被裁。中間面試被打擊,失落,看到新聞那那都在裁員,到現在面試整體感覺還不錯。還是想分享一下自己的心裡路程,想告訴大家,裁員別慌,做自己該做的,其他自己決定不了的,先放一放,心裡列一個123,一條一條來。
可以看到我在上面推薦了很多書籍,而且JAVA部分時分塊來了。是因為當我看到很多面試題,針對題來的時候,題會很多,而且有時候你會覺得你的題都會了,但是面試的時候還是面不好,說明你的知識並不紮實。或者你知識會了這個題,並沒有融會貫通,所以在JAVA部分我分大塊來描述,而且針對每一塊,我都有推薦一本相關的書,你可能不需要都看,可以針對性的看。而Android部分時詳細的知識點,這些知識點我希望的是,能夠深入研究。而推薦的書籍,書中的部分都有一些相關的知識點,大家也可以選擇性的看,當然論壇,部落格都是知識的來源,大家做好知識點深度和廣度的基類就行了。
最後,雖然裁員的很多,都在說Android要沒落,但是,不要慌,做自己的計劃,學自己的習,競爭無處不在,每個行業都是如此。祝大家2019年萬事大吉。
最後
針對於上面的面試題,我總結出了網際網路公司Android程式設計師面試涉及到的絕大部分面試題及答案,並整理做成了文件,以及系統的進階學習視訊資料,免費分享給大家。
(包括Java在Android開發中應用、APP框架知識體系、高階UI、全方位效能調優,NDK開發,音視訊技術,人工智慧技術,跨平臺技術等技術資料),希望能幫助到你面試前的複習,且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
領取方式:關注+點贊+加群:185873940 免費獲取!

image