厲害了,一年萌新的Android大廠麵筋,趕緊來看看!(B站、京東、攜程、騰訊...)

南方吳彥祖_藍斯發表於2020-11-11

19 年雙非本科畢業,洋洋灑灑的寫了一年多業務,九月份開始面試,將一些面試題分享給大家,希望對大家有所幫助。基本上問的都差不多,我就不按公司分類了,面了得物、閱文、B站、京東、攜程、百度、觸寶、騰訊、拼多多,最後小破站和鵝廠掛了(某訊是真的氣,基本上不按簡歷問)。

正文

下面是一些我印象中的面試題:

Java

1. 反射、註解、泛型、異常瞭解嗎?

基本上都會被問到,回答的時候只是回答基本使用是不夠的,可以說一下它們在 JVM 裡面的實現原理。比如反射的效能損耗在哪,怎麼最佳化?註解的資訊存放在哪?註解的兩種處理方式(反射和 APT )。泛型擦除怎麼理解?泛型的 PECS 原則如何理解(典型的一個例子就是 Collections.copy 方法)?異常的兩種方式(Exception 和 Error)分別簡單說一下?異常例項的構造?異常表?finally 為啥總是會執行?

2. Java 集合原始碼

問的最多的莫過於 HashMap 了。HashMap 的擴容機制、hash 衝突的解決、負載因子為什麼是 0.75,為什麼連結串列長度的邊界值是 8,取索引的過程?非執行緒安全,所以就牽扯到了 ConcurrentHashmap、然後又牽扯到 CAS 等等。

最後也可以說一下 Android 中推薦的使用的 SparseArray、ArrayMap (裡面存在兩個快取佇列)的最佳化,原始碼也要看一下。

ArrayList 比較簡單,有一家讓我直接手寫實現,可以練習一下。然後又可以牽扯到執行緒安全的 Vector、CopyOnWriteArrayList。

3. JVM

問的最多的就是記憶體區域的劃分以及 GC。回答的時候需要注意,標記清除是清除未被標記的物件;還有 GCRoots 物件是哪些?CMS 就別說了,已經被廢棄了,可以說一下 G1、ZGC 這些。然後就是引用計數法和可達性分析,這個可以擴充套件說一下 Android Framework 層使用到的智慧指標,它就是使用的引用計數,然後說一下它是怎麼解決迴圈引用問題的。

類載入機制問的也不少,除了 Java 中的,還可以說一下 Android 中的 DexClassLoader,Android 8 的改動?然後就可以引申到了外掛化和熱修復了。

還有一些問到虛擬機器的。這時候先從 Java 的 HotSpot (解釋執行和編譯執行,分層編譯)說起,然後到 Dalvik,最後到 ART。期間涉及 JIT、AOT 編譯,什麼區別?profile 效能分析?對垃圾回收的改進,如果最佳化 GC 停頓(可以參考 G1 回收流程)?

4. 併發

問的最多的也就是 synchronized 和 volatile 的實現原理了。synchronized 的基本使用?1.6 的改進(無鎖、偏向鎖、輕量級鎖、重量級鎖)?Java 物件頭?實現原理(ACC_SYNCHRONIZED、monitorenter/monitorexit 指令)?volatile 的可見性(lock 字首+快取一致性協議)和有序性(記憶體屏障)的實現原理?CAS 的實現(ABA 問題、迴圈時間長開銷大問題、只能保證單個共享變數的原子性)?UnSafe 類的理解?

執行緒池,問的也很多,但是基本上都是問執行緒池的那幾個引數的意思。

Android

1. 基礎

基本上都大差不差,Activity 和 Fragment 的資料傳遞,生命週期、啟動模式;

動畫的使用,估值器、插值器(其實就是三角函式)都比較簡單。

View 的繪製流程(從 Activity 的 attach 到 onResume),然後延伸到如何自定義 View,為什麼要重寫 onMeasure、MeasureSpec 的理解?

View 事件分發,需要注意 onCancel 的觸發時機(典型的就是 RecyclerView 的點選滑動)?除了一般部落格上面寫的 Activity -> ViewGroup -> View 的流程。還可以說一下事件從哪裡來的(InputManagerService)?事件最先是分發給 Activity 的嗎(其實是 ViewRootImpl 裡面的 mView,也就是 DecorView)?IMS 是如何分別處理 KeyEvent 和 TouchEvent 的?

在講 View 的繪製流程,在 scheduleTraversal 時可以延伸到 View 的重新整理機制。Vsync 訊號的處理?四種回撥前三種都比較好理解,Commit 回撥是怎麼觸發的(onTrimMemory)?Vsync 計算掉幀,如何監聽線上的卡頓情況,一種就是利用 Vsync,還一種就是 BlockCanary 的利用 Handler 回撥。

然後就是 Handler 機制,這個基本上大家都懂,不過可以說一下記憶體屏障、為什麼沒有卡死、IdleHandler 在實際專案中怎麼用到的?

2. Framework

其實前面我們在回答 Android 基礎時就已經講到不少 Framework 的東西了。所以這一塊直接問的比較多的就是 Activity 啟動流程和 Binder 機制。在講 Activity 流程的時候,可以說一下外掛化 hook 式的 hook 點,以及 Android 8、10 啟動 Activity 的流程改動。

Binder 機制,先說一下 Linux 下的 IPC 通訊方式(管道、Socket、訊號量、共享記憶體,其實這些在 Framework 層都有使用到,可以簡單講一下)。然後就是著重講 Binder 的通訊模型,Binder 在驅動層是如何表示的(binder_node、binder_ref 資料結構)?ServiceManager 的代理物件的獲取(getStrongProxyForHandle(0))、Service 的註冊?開啟 Binder 機制的三大流程?

外掛化和熱修復,外掛化的靜態代理式(這個很好寫,就是剛哥的 dynamic-load-apk)和 Hook 式;熱修復我也只瞭解騰訊系的類載入機制的 dex 插樁,如果熟悉阿里系的底層替換方案也可以說一下。

3. 效能最佳化

這個就可以根據實際在專案中做了哪些來說了。我是寫了包體積最佳化(減少 8M+)、佈局最佳化(過度繪製和佈局巢狀)、記憶體最佳化(LeakCanary + Android Profile)。

4. Gradle

因為我簡歷上的個人技能和專案經歷都寫了 Gradle,所以這一塊問的也比較多。主要是問了編譯打包流程(AAPT 和 AAPT2 的區別)以及一些專案中做了哪些事(構建最佳化、寫了一個 Gradle 外掛)。

計算機網路

1. TCP

必問,一定要回答全哦。TCP 的面向連線(三次握手、四次揮手)、基於位元組流、全雙工、可靠性(流量控制、擁塞控制、重傳機制等)。TCP 的缺陷(隊頭阻塞),以及 HTTP3 的怎麼解決的?TIME_WAIT 狀態的理解?

2. HTTP/1.x、HTTPS、HTTP2、HTTP3

必問,這個只要成體系了,就很好回答了。

先從目前使用最廣泛的 HTTP/1.1(二十多年前的版本)開始回答,長連線、如果傳輸大資料、現在有什麼最佳化措施(每個域名六個併發連線、域名分片、精靈圖等等),HTTP 1.x 的問題(應用層的隊頭阻塞、未壓縮 Header、明文傳輸),HTTP2 是如何解決的(多路複用、HPACK 演算法、二進位制資料)?HTTP 的不安全性(機密性、問完整性、身份校驗)由 HTTPS 保證(TLS_ECDHE_RSA_AES_128_GCM_SHA_256 + PKI)?

HTTP2 (基於 SPDY 協議)只解決了應用層的隊頭阻塞問題,但是並沒有解決傳輸層的隊頭阻塞,所以可以說一下 HTTP3 是如何解決的(基於 QUIC 協議,使用 UDP)?連線遷移、前向冗餘糾錯?

演算法

某度:判斷合法的 IP 地址。

某多:陣列奇偶排序,樹的最大深度(遞迴和迭代都要寫),加面演算法判斷是否是同花順:

花色:R : 紅色,B: 黑色,M: 梅花,F: 方塊;牌大小:A、2、3、4 ... K;
輸入:["RA", "R2", "R3", "R4", "R5", "B4", "M2", "F1"] 
返回 true,可以構成一個同花順。
輸入:["FJ", "FQ", "FK", "FA", "F2"]
返回 false。

某訊:島嶼問題

某寶:對稱二叉樹(遞迴和迭代都要寫)

如何進階Android?

有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什麼東西。

對於程式設計師來說,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提升自己, 從來都是我們去適應環境,而不是環境來適應我們!

最後我在這裡分享一下這段時間從朋友,大佬那裡收集到的一些 2019-2020BAT 面試真題解析,裡面內容很多也很系統,包含了很多內容: Android 基礎、Java 基礎、Android 原始碼相關分析、常見的一些原理性問題等等,可以很好地幫助我們深刻理解Android相關知識點的原理以及面試相關知識。

1、確定好方向,梳理成長路線圖

不用多說,相信大家都有一個共識:無論什麼行業,最牛逼的人肯定是站在金字塔端的人。所以,想做一個牛逼的程式設計師,那麼就要讓自己站的更高,成為技術大牛並不是一朝一夕的事情,需要時間的沉澱和技術的積累。

關於這一點,在我當時確立好Android方向時,就已經開始梳理自己的成長路線了,包括技術要怎麼系統地去學習,都列得非常詳細。

厲害了,一年萌新的Android大廠麵筋,趕緊來看看!(B站、京東、攜程、騰訊...)

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

2、透過原始碼來系統性地學習

只要是程式設計師,不管是Java還是Android,如果不去閱讀原始碼,只看API文件,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。

真正最能鍛鍊能力的便是直接去閱讀原始碼,不僅限於閱讀各大系統原始碼,還包括各種優秀的開源庫。

厲害了,一年萌新的Android大廠麵筋,趕緊來看看!(B站、京東、攜程、騰訊...)
《486頁超全面Android開發相關原始碼精編解析》

3、閱讀前輩的一些技術筆記

厲害了,一年萌新的Android大廠麵筋,趕緊來看看!(B站、京東、攜程、騰訊...)
《960全網最全Android開發筆記》

4、刷題備戰,直通大廠

歷時半年,我們整理了這份市面上最全面的安卓面試題解析大全
包含了騰訊、百度、小米、阿里、樂視、美團、58、360、新浪、搜狐等一線網際網路公司面試被問到的題目。熟悉本文中列出的知識點會大大增加透過前兩輪技術面試的機率。

如何使用它?

1.可以透過目錄索引直接翻看需要的知識點,查漏補缺。
2.五角星數表示面試問到的頻率,代表重要推薦指數

厲害了,一年萌新的Android大廠麵筋,趕緊來看看!(B站、京東、攜程、騰訊...)
《379頁Android開發面試寶典》

以上內容均放在了開源專案: github  中已收錄,大家可以自行獲取。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2733650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章