
前言
前段時間稍專門挑了一段時間在準備面試,經過兩次面試后,有一些比較深刻的認識,對于大廠來說,除了對專業知識考究之外,對演算法也尤為看重,
簡單的說一下情況,位元組已經拿到offer,騰訊所有的面面試已經通過了,也應該有offer了,位元組一共4面:3面技術,1面hr;騰訊5次技術面,1次hr面,其中5面是2個面試官上陣,
總的來說騰訊的面試確實強度更高更加持久,位元組是分開一次1個小時面試的,而騰訊1、2面是一次一小時,而3面和4面是連續面試一口氣高強度的面試2小時,5面則是2個面試官輪流提問,騰訊是持久戰稍微腦子不清醒一點就可能出現大錯漏,我在4面就是如此,差點出事了,請準備好糖分和水分及時補充,或者洗把臉保持清晰,
正文
面試的程序一般只有1個小時,如何在一個小時內徹底的考究你本人的水平究竟到達那種境界,也是面試官努力的方向,
而面試往往是由兩部分構成:
- 1.演算法
- 2.專業知識
關于演算法
為什么把演算法擺在第一點,因為演算法在我看來這是大部分沒有面試過大廠的朋友可能會忽視的一方面,它的重要程度不比專業知識的考究來的低,
在1-2小時內,如何能快速的看到你編碼水平和思維就看這些演算法的考究,
因此需要對常見的資料結構比較熟悉,如鏈表,樹,堆疊,堆,需要知道遇到陣列相關的題型可能需要用到如快慢指標等解題思路,還有廣度深度優先演算法,最后,如果還有更難一點的,會涉及到回溯,動態規劃等解題思路,
前面幾點都比較好處理,只要在leetcode上做到一定量的題目,都能反應過來,經過了系統性的訓練,遇到一些常見的演算法解題思路可以快速的反應過來,
而動態規劃相關的問題,我看來是最難的,關鍵是需要判斷題目是否可以分解成小問題且小問題之間不能互相影響,接著找到動態規劃方程,或者是狀態轉移表,
在聽到面試官的演算法題后,先不要急著下筆,最好在下筆之前和面試官聊聊你的思路,不同面試官的要求不同,有的面試官,希望演算法是原地演算法,有的面試官希望時間復雜度降低,有的希望空間復雜度降低,
最好能清晰的表達你的初步思路后,面試官會知道你的演算法的方向是否正確,可以一定程度上給予你方向上的指引,
記住就算你做過原題,除非你的方案能保證是從空間和時間復雜度是最優,不然我還是建議面試者多和面試官交流,在交流的程序中,面試官也能明白你的思考程序,從而判斷你這個人的編程能力如何,
最后,再給兩點建議:
-
一個人光看不練是不行的,一個人瞎琢磨效率偏低,
-
最好可以買幾本書或者課程指導,我是看了輝哥的課程,閱讀了極客時間的劉超的資料結構,還閱讀了書籍演算法4,把基礎都補充好后,可以去leetcode中對每一個資料結構專項進行訓練,在這些基礎上,在做一做劍指offer中經典題目也就差不多了,
關于專業知識
網上很多人都在求大廠面試的真題,實際上我看來意義并不大,因為面試官并不會面試你寫在簡歷之外的隨意一個問題,一般都是問你簡歷上的作業成果,以及背后延伸出來的知識點,更多的還是需要自己日常的積累,
當然也有一些老生常談的基本考點,如Handler,多執行緒等,
因此,背面試題不是最重要,關鍵是回顧你的簡歷上的作業成果以及簡歷上的知識點,并不斷的深挖,
下面是面試情況,以及一些簡答,實際上在回答的程序中,可以回答的更加詳細,本文只是篩選了部分問題簡單介紹了知識點的要點,

位元組面試
位元組面試一共4面,位元組的面試風格偏向基礎的內容,以及簡歷上知識點的擴展,
位元組1面
- 自我介紹,專案經歷,專案上的優化項以及原因
- 為什么使用
mmap優化io讀寫,mmap和傳統讀寫有什么區別?為什么選擇它? - Object 中有什么方法?
- Object 的equal實作?重寫equal需要注意的方面,
synchronized原理,volatile原理- ui優化
- 記憶體優化與LeakCanary的原始碼?以及LeakCanary的缺點和如何解決,
- 演算法:陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字(Leetcode原題),
位元組2面
- 自我介紹,專案經歷,專案上的優化項以及優化的原因
- Rxjava原始碼原理,以及專案中你是如何將Rxjava流進行復用,
- 你專案中高度自定義了DiskLRUCache,問LRUCache的實作?問LinkedHashMap的實作?問DiskLruCache的實作?問Glide中實作的DiskLruCache的運用,
- Handler的原理
volatile原理synchronize鎖的轉化流程,ReentrantLock實作,- ui 優化,首屏渲染時機優化
- 啟動優化,與AlphaManager的實作,
- 插樁的原理以及運用,
- ASM
- Javapoet
- 動態代理
- LiveData 和 ViewModel的原始碼實作
- x2c 原始碼實作
- DNS 原理
- https的原理
- 演算法:判斷一個字串是否是回文串(注意保證原字串不可改變,可用O(n)的空間復雜度),
方向:堆疊的考究,
位元組3面 Leader面
-
1.作業軟技能的考核,以及團隊中的定位
-
2.如何進行io 優化,指標是什么,優化后的結果以及引數是多少?
方向:可以使用/proc/pid/stat讀取cpu的idle,iowait等,使用mmap優化后的結果,
- 3.演算法:在一個單鏈表中,每k個節點進行反轉,無法被反轉的部分放在末尾,

騰訊面試
騰訊的面試風格,普遍是基于你的簡歷上專案經歷,往細節往深處問,我是面試因演算法失敗了一次,后面第二次就成功了,
總結一下2次騰訊面試
騰訊第一次面試1面
- 自我介紹,專案經歷,專案上的優化項以及原因
- ARouter 原始碼實作,專案中對ARouter的擴展實作詳細設計
- ui 優化,啟動優化,首屏展示時機優化
volidate實作- Java例外捕獲
- DNS 原理
- https的原理
- jni 中JNIEnv 和執行緒的關系
- jni中有幾種注冊native方法,
- Native例外捕獲
騰訊第一次面試2面
- 自我介紹,專案經歷,專案上的優化項以及原因
- ARouter的實作,以及自定義擴展ARouter的實作
- 專案中的io 優化,以及為什么用mmap于io優化
- mmap的實作
- mmkv 中 對應 mmap 斷電時候的處理機制
- mmap沒呼叫msync時候,落盤時機,
- 演算法:合并三個單鏈表(可參考leetcode 合并多個單鏈表)
因為自己畫蛇添足,把每一個節點拷貝了一次,還沒有往后迭代,實在是錯漏百出就掛了,腦袋還是不夠清醒,結果飲恨而歸,
騰訊第二次面試1面
- 自我介紹,專案經歷,專案上的優化項以及原因
- ARouter 的實作,以及擴展的實作
- 啟動優化,以及ARouter的啟動優化方式,ARouter的磁區方式
- Navigation的原始碼決議
- 基于Navigation 撰寫路由框架NavigationRouter 的原始碼實作,以及實作的優點
- Navigation 實作的路由框架中如何處理Activity和Fragment 嵌套啟動的方式
- class的加載流程
- Handler的實作(最好能回答到epoll和eventfd的層面)
- 實作一個多執行緒下的消費者生產者模式
騰訊第二次面試2面
- 自我介紹,專案經歷,專案上的優化項以及原因
- io 優化 與 使用
mmap的優勢和缺點 - ARouter 的實作,以及擴展的實作
- 多行程實作的路由
- 如何進行多行程的同步呼叫,此時另一個行程還沒有啟動?
- 資料結構中不支持多執行緒的資料結構,如果使用多執行緒操作會造成什么結構
ArrayMap實作HashMap與ArrayMap比較,兩者的優缺點- handler 的原理
- handler 是怎么進行postDelay 延時操作,
- 當handler 只有一個延時的message時候,Looper中是如何運行,
volidate原理- 當沒有添加
volidate修飾屬性的時候,資料什么時候從快取行重繪到主存, - 演算法題:在一個n*n的方格中,有兩種方格,1代表阻塞不能經過,0代表可達,兩點坐標,a和b,問a到b的最短路徑,
騰訊第二次面試3面和4面
騰訊3面和4面是聯系到一起的,這里一起說了
- 自我介紹,專案經歷,專案上的優化項以及原因
mmap實作原理和io優化- View的繪制流程,從
setContentView決議xml到View的繪制結束, - 硬體渲染流程
- SurfaceFlinger 在 View繪制流程中扮演的角色
- Choregrapher 的作業原理
- OOM 如何優化,記憶體爆滿是虛擬記憶體容易先爆掉還是物理記憶體容易,一口氣映射4g的記憶體是否會發生例外,
- Bitmap 如何優化避免OOM,為什么放在native中bitmap不容易OOM
- 一個行程最多可以使用多少fd
- 你研究過RN和Flutter,RN的渲染機制和Flutter的渲染機制是如何運作的?他們之間區別是什么?
- 插件化你是如何實作的,
- 演算法1: 將一個int的數字轉化成漢語說法,如10000轉化為一萬,
- 演算法2:中國下棋的馬,能否吃掉另一個坐標的旗子,請找出坐標
騰訊二次面試5面
本次面試是兩個面試官進行考察,考察的東西偏向網路協議,
- 自我介紹,專案經歷,專案上的優化項以及自己開源在GitHub上專案的特點,
- 當遇到弱網路時候的優化
- 當遇到弱網路時候,網路是如何進行檔案重傳
- 當遇到弱網路時候,手機連接上了4g,但是沒有資料流量時候,如何檢測并恢復,
- 當app在播放音視頻的時候,需要注意的要點,以及相關的實作,
總結
從專業技能考察可以看到,實際上整個面試程序,騰訊面試的會相對仔細一點,技術廣度更加廣一點;而位元組則更加偏向基礎是否扎實,都是從你的簡歷專案,技術點開始詢問,并根據你回答的問題,不斷的調整詢問的方向,不斷的向下挖你的知識點,看能達到什么程度
但是無論如何,你回答的層面最好足夠深,從原始碼層級說起來,有時候面試官的對問題的看法和你的看法有分歧,此時就需要你是否可以從原始碼的層面上對這些問題有自己的解釋,
面試的時候只需要沉著冷靜的思考,從原始碼的角度對面試官拋出來問題進行分析,就能比較輕松的解決,
最后有人好奇我去了哪里,應該是去騰訊,
Android開發技能儲備
Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界里立足,
如果你覺得自己學習效率低,缺乏正確的指導,可以參考下下面分享我多年作業以來收集整理的學習路線,給大家做個參考:
學習一線大廠的各項技術:
大廠是我們的技術先驅,不僅僅是各種技術,還有很多令你大開眼界的使用方法,學習這些有利于自己競爭力的提高,深入理解后也可以提升你的學習效率,
現在競爭這么激烈,只有通過不斷學習,提高自己,才能保持競爭力,
1.2020大廠面試高頻知識點
- 圖片
- 網路和安全機制
- 資料庫
- 插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 架構設計和設計模式
- 性能優化
- Android Framework
- Android優秀三方庫原始碼

2.Jetpack架構組件從入門到精通
- Android Jetpack - Navigation
- Android Jetpack - Data Binding
- Android Jetpack - ViewModel & LiveData
- Android Jetpack - Room
- Android Jetpack - Paging
- Android Jetpack - WorkManger
- Android Jetpack架構組件之Lifecycle
- Android Jetpack Compose 最全上手指南

3.Framework精編內核決議
主要內容包含:
- 深入決議Binder
- 深入決議Handler
- Dalvik VM 行程系統
- 深入決議 WMS
- PackagerManagerService

4.Kotlin強化實戰(附Demo)
- 第一章 Kotlin入門教程
- 第二章 Kotlin 實戰避坑指南
- 第三章 專案實戰《Kotlin Jetpack 實戰》
- 從一個膜拜大神的 Demo 開始
- Kotlin 寫 Gradle 腳本是一種什么體驗?
- Kotlin 編程的三重境界
- Kotlin 高階函式
- Kotlin 泛型
- Kotlin 擴展
- Kotlin 委托
- 協程“不為人知”的除錯技巧
- 圖解協程:suspend

5.Android設計思想解讀開源框架
- 熱修復
- 插件化
- 組件化框架設計
- 圖片加載框架
- 網路請求框架
- RXJava 回應式編程框架設計
- IOC 架構設計
- Android架構組件Jetpack

6.NDK模塊開發
- NDK 模塊開發
- JNI 模塊
- Native 開發工具
- Linux 編程
- 底層圖片處理
- 音視頻開發
- 機器學習

定期面試:
光學習了大廠的技識訓不夠,如何了解當下Android市場需要哪些技術呢?
定期的面試足以讓你了解當下市場需要哪些技術,也更加容易確定自身的短板在哪,同時,也可以督促自己學習提升(小伙子,你了解的技術有點落伍了呀…)
萬一拿到了高薪Offer,豈不是更賺?

《379頁Android開發面試寶典》
多看大佬的學習筆記,學習大佬的設計思想:
只要是程式員,不管是Java還是Android,如果不去閱讀原始碼,只看API檔案,那就只是停留于皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的,
真正最能鍛煉能力的便是直接去閱讀原始碼,不僅限于閱讀各大系統原始碼,還包括各種優秀的開源庫,

《486頁超全面Android開發相關原始碼精編決議》
以上這些內容均免費分享給大家,需要完整版的朋友,點這里可以看到全部內容,或者點擊 【這里】 查看獲取方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/291347.html
標籤:其他
