一個自學Android 人的第三年的面經分享

一.前言

最近事情比較多,工做比較忙,同時在自學泰語和前端,精力比較分散。差點這份面經就跳票了,感謝同行的鼓勵讓我從新提筆。前端

數數這也正好是我入行的第三個年頭了,僥倖當年在外包公司獲得實習的機會,今後開始了IT生涯。回頭看看這三年一步一步走來,真是吃了很多苦頭。不知道大家有沒有跟我一樣的經歷,剛畢業的時候什麼都不懂,渴望一個機會,去面試當面被面試官批評太差勁。剛入行的時候,沒有牛人帶,總盼望着誰拉扯本身一把,什麼都得本身摸索,一步一步本身踩坑。才工做一兩年的時候,就感受遭遇了瓶頸,將來一片迷茫,不知所措。這些我都經歷過,我甚至還經歷過比這更糟糕的狀況。幸運的是,我堅持了下來。
git

二.我的背景

先介紹下我的履歷,做爲面試的參考,拋開背景談面試都是耍流氓。程序員

雙非(非985,非211)一本電信專業畢業,半跨行從事IT行業,工做三年,跳槽前沒有互聯網履歷,第一份工做在外包公司任職,第二份在公募基金公司任職。github

若是你是專科畢業,我建議你至少要考個本科學歷web

如今不少公司簡歷審覈的時候都會卡學歷,我以前任職的基金公司甚至一度卡到985,211。雖然IT是靠能力吃飯的行當,可是隨着從業人員的增多,市場的門檻也會隨之調整。我有時候甚至以爲本科都有點不夠看,建議專科畢業的同窗至少要考個本科學歷,否則很容易失去面試機會。即便面試經過了,在最終的HR面也很容易被刷。面試

三.面試準備

3.1養成平常學習的習慣,而不是依賴考前突擊算法

個人面試準備週期很長,差很少從17年12月底開始有想出去看看的打算,一直到18年6月才最終拿到滿意的offer,這個期間我一直在查漏補缺。但個人學習週期更長,從17年5月進入一個平常學習的狀態,花了一年時間跟着網課完成了系統性的學習,中間還看過不少書。數組

我不建議你們只在面試前夕進行突擊學習,背面試題,這種技巧可能會讓你得到一個offer,但沒辦法提高你的我的能力。我建議養成一個平常學習的習慣,天天抽空學幾個小時,在面試前把總結的知識點重溫一遍便可。這種習慣日復一日所帶來的複利會讓你的技術在某一刻由量變產生質變。緩存

3.2人不是神仙,不可能面面俱到安全

業內常常會調侃,面試造航母,工做擰螺絲。你不可能問什麼都能答的上來,因此你要調整好心態坦然接受失敗。不得不說準備面試真的是個很痛苦的事情,耗費精力不說,你可能忽然會發現你原來這也不會,那也不懂,自覺得拿手的本事被人兩三下就問懵逼了,信心嚴重受挫。但你要相信本身,跌倒了沒關係,再爬起來就好。

關於面試具體要準備什麼,聊這方面的文章不少,我簡單梳理一下,後面也會有我部分公司面試題的總結。

  • 多線程、JVM

    這兩塊的知識點是讓你能順利經過大廠一面的保證,我所經歷過的阿里、頭條面試一面基本圍繞這些知識點展開。

  • 開源框架

    我以爲多多少少須要看一些框架源碼,瞭解其中的原理,掌握其中的核心,而且能用本身的語言,陳述出來。還有時下比較流行的東西面試官問的概率很高,好比組件化、hybrid。多讀讀源碼也能培養本身讀代碼的能力,這樣的本事能讓你很快的瞭解一個新的項目或者一個新的框架。

  • 性能優化

    這一塊也是不少公司喜歡問的,特別是當部門架構組團隊招人的時候喜歡問。我不太擅長這方面,就很少談了。

  • 數據結構及算法

    在我係統學習的過程當中我是把數據結構和算法跟着課程學了一遍的,可是我面試期間是徹底放棄複習算法的。這麼說並非說算法不重要,頭條的面試上來就會考一道算法題,喜歡考算法的廠也愈來愈多。只是你們要根據本身的實際狀況分配複習的比重。畢竟數學考試最後一道大題你作不來,你能夠把前面的小題爭取所有作對。

四.簡歷

簡歷是敲門磚,也多是面試的引線

你們必定要重視簡歷。對於學校不優秀,工做背景不突出的同窗,簡歷是你的敲門磚。簡歷寫的很差,你可能直接會錯過一次展現本身的機會。

在面試中不少面試官會根據簡從來提問,因此你擅長的東西,必定要寫在突出的地方讓面試官看到,主動引導面試官問你你擅長的問題。在回答問題的時候,千萬不要隻言片語草草結束。每次被提問,都是一次展現本身的機會。儘量的說全,說詳細。接着面試官可能圍繞你說的內容進行深挖去考察你,因此你的知識點不能浮於表面,否則兩三個回合可能就被問的啞口無言。若是你實在有些知識點不懂,儘可能的在回答中規避這些細節,省得面試官一時興起問你一下。

那麼簡歷到底該怎麼寫,有些同窗可能會以爲,我平時工做都在堆業務,項目上沒有什麼能夠寫的怎麼辦。首先再回頭看一看項目裏是否是真的沒有什麼閃光點,日活、品控、性能這些都能做爲你的談資。若是實在沒有那就去研究兩三個主流開源框架,讀讀Android SDK源碼,寫點開源項目放到github上。你也能夠搞明白本身項目的業務架構,鑽研一下組件化、熱修復、插件化、hybrid等熱門技術,深究一下性能優化好比卡頓監測、APK瘦身、DEX加密、過渡繪製等。每個點它均可能成爲你成功的鑰匙。

五.面試題

生活是場修行,認真對待每場面試

這裏寫了部分大廠面試題做爲你們複習的參考,平安系的面試主要問的項目,包括個別小廠面試沒什麼參考性,這裏就不寫了。

頭條的面試質量很高,覆盤的時候有種醍醐灌頂的感受。

攜程的面試很不走心,大老遠跑一趟最後面試官都不給我提問的機會面完直接走出去了,我也沒差到這種地步吧。

阿里的面試比較隨機,兩次下午上班的時候來電面試,一次是晚上來電面試。

5.1東方財富

筆試
  • 簡述類加載機制
  • 寫三種單例的實現方式
  • Activity生命週期
一面
  • Handler機制
  • 事件分發機制
  • 樂觀鎖與悲觀鎖
二面
  • Android 7.0 8.0 p 兼容性問題
  • 嵌套滑動
  • 營銷工具好比列表第三位展現廣告,如何設計接口

5.2螞蟻金服

一面
  • 內存泄漏
    • 具體場景
  • 大圖加載
    • 大圖加載的緩存
    • Bitmap優化
  • Handler機制
    • 子線程能不能建立Handler
    • 線程間通訊其餘方式
  • 線程的建立與退出
    • 樂觀鎖與悲觀鎖
    • volatile原理
    • 讀寫鎖的應用
  • RecyclerView與ListView的區別
    • RecyclerView爲何這麼設計
    • 應用
  • 自定義控件
    • 事件分發機制
    • 動畫
  • okhttp支不支持優先級
    • ssl握手誰實現的
    • websocket應用
  • 簡述日誌系統
二面
  • 介紹項目架構等,圍繞項目進行提問
  • 序列化的做用
  • 子線程輪詢阻塞隊列如何安全回收線程
5.3Musical.ly(頭條)

一面

算法:數組中的數據前半部分遞增,後半部分遞減,排序並去重

Java虛擬機

  • 虛擬機內存結構
    • 哪些是線程私有,哪些線程公有
    • 靜態常量的存儲位置
    • 無窮遞歸方法引起的問題
  • GC機制
    • GC roots是什麼
    • Handler形成內存泄漏的整個引用鏈
  • 什麼狀況會產生ANR
  • 廣播
    • onReceive方法調用線程
    • 靜態廣播接收流程
    • 動態廣播接收流程
    • 動態廣播能不能重複註冊
  • SurfaceView原理及使用注意事項
  • ButterKnife工做原理
  • 仿微信朋友圈圖片展現設計思路

------如下問題都是面試官根據簡歷問的------

  • 熱修復
    • 熱修復原理
    • 假如某個類A有個bug,熱修復的整個流程
    • 該修復方案是否能避免oat致使的一些問題
  • LeakCanary原理
  • Groovy插件
    • APK瘦身如何實現的
    • 自定義任務在某個任務以前或以後執行怎麼寫
    • Gradle打包的整個過程
  • 看過哪些Android源碼
    • 攔截Activity跳轉有哪些Hook點
  • Groovy和Java的比較

二面

  • 類加載過程
    • 觸發類初始化的時機
    • 被動引用
  • Activity啓動模式及幾個模式的應用場景
  • onSavedInstanceState相關
    • 滅屏會不會觸發onSavedInstance
    • onRestoreInstanceState和onSavedInstanceState是否成對出現
  • Service生命週期的理解
    • bindService整個代碼怎麼寫
    • 與service通訊是否會阻塞當前線程
    • 若是是耗時方法,爲何會阻塞
    • 若是不是耗時方法,爲何不會阻塞
    • 若是遠端是耗時操做,怎麼不等待結果讓主線程先運行
    • startService和bindSerivce對service生命週期的影響
    • aidl傳遞Bitmap須要注意的事項

5.4攜程

一面

  • EventBus原理
  • Java中有哪幾種註解
    • 具體註解名稱
    • 如何自定義註解
  • EventBus是什麼註解
    • 能不能用編譯時註解實現EventBus
    • 註解處理器怎麼工做
    • 註解處理器有哪些API
  • Glide原理
  • Lrucache原理
  • LinkedHashpMap原理
  • HashMap原理
    • 解決Hash衝突的方法
    • equals和hashcode做用
    • hashcode如何實現
  • Object類下有什麼方法
  • 使用過哪些熱修復
    • 熱啓動熱修復原理
    • 冷啓動熱修復原理
  • Android中的類加載器
    • 類加載器之間的區別
    • Dex融合用的哪一種類加載器
    • 父類是什麼及三者之間的關係
  • 雙親委派模型
  • APK瘦身
  • Android中的動畫及區別
  • Handler原理
  • Android中序列化方式
    • 二者區別
    • 爲何Parcelable性能更好
    • 序列化UID做用
  • ThreadLocal原理
  • Java中有哪些鎖
    • 悲觀鎖與樂觀鎖的區別
    • 自旋鎖的做用
    • 鎖通常是怎麼實現的
    • 讓你本身實現,怎麼實現一個鎖
  • 內存優化有哪幾種方式
  • 佈局優化有哪幾種方式
  • 線性佈局在onLayout裏面作了哪些工做
  • 谷歌爲何給Activity設計這麼多生命週期

5.5招行信用卡中心

(招行是架構組招人,問的問題主要是架構方面和安全方面,比較開放,簡單總結一下)

  • 工程結構縱向橫向如何拆分(項目架構)
    • 若是解決代碼依賴
    • 兩個隔離模塊的數據交互
  • 開發過程當中遇到的問題
    • 內存泄漏
  • 項目中首頁的實現
    • VLayout實現原理
    • 爲何不用RecyclerView實現多Item
  • 熱修復差分文件的驗證(安全性)
  • 公鑰私鑰體系
    • 應用場景
    • HTTPS鏈接過程
  • 應用構建過程
  • 應用簽名校驗過程
  • V1簽名和V2簽名區別
  • Dex加固原理
  • APK瘦身

六.展望

幹這行三年了,本身恐慌過,也看到過別人恐慌。擔憂行業日落西山,擔憂Android被大前端統一。這樣的擔憂也不算沒有道理。但其實真正讓我恐慌的是我沒在進步,而行業在不斷進步,擔憂跟不上行業的腳步。做爲程序員,仍是要保持一顆學習的心態,不斷前進。但也但願你們在繁忙的工做、學習之餘抽身出來多培養些興趣愛好,多陪陪家人朋友。多打磨一下本身的軟技能,提升談吐、情商、表達能力。這些也是一個優秀的程序員所須要具有的條件。

我不算是一個優秀的程序員,也只是努力的在這條路上前行,但願能作一些本身喜歡的事情。

若是有機會,會在博客上跟你們分享一些安卓之外的內容。

願每一個人都有夢想,也願每一個人都能堅持本身的夢想

相關文章
相關標籤/搜索