2019最全大廠Android高級工程師面試題整理

臨近年末,很多小夥伴心裏大概都準備着年後找工作或者跳槽。最近有很多同學都在交流羣裏求大廠面試題。正好我電腦裏面有這方面的整理,於是就發上來分享給大家。

這些題目是網友去百度、小米、樂視、美團、58、獵豹、360、新浪、搜狐等一線互聯網公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的機率。面試題精編答案解析已經整理在了石墨文檔點擊前往領取:https://shimo.im/docs/PXhwVR6YY9tjwcrY
主要分爲以下幾部分:

(1)java面試題

(2)Android面試題

(3)高級開發技術面試題

(4)跨平臺Hybrid 開發

1.Java 基礎部分

基本這些公司都會問到相關基礎,所以,一般來說基礎的準備是必要並且通用的,所以這部分真的很重要。

HashMap 和 HashTable 以及 CurrentHashMap 的區別。
一般來說,這三個東西基本在面試中 70% 會被問到,而問的方向也不太一樣。比如初級的問法是講講它們之前的區別,這個我想沒什麼難度,大多數人還是知道主要核心區別是併發上的處理。此外,內部數據結構的實現、擴容、存取操作這些問題應該是很老生常談了,這並沒有什麼好說的,大多數人也都知道。稍微問的深一點的可能會在下面這些點上出問題。哈希碰撞,哈希計算,哈希映射,爲什麼是頭插法,擴容爲什麼是 2 的冪次等這樣的問題。
synchronized 和 volatile 、ReentrantLock 、CAS 的區別。
這個問題被問頻率不在 HashMap 之下,因爲併發編程,真的很重要。能問到這幾個點的方式真的是太多了,我們能發揮的空間也同樣很大。CAS 的 ABA 問題?上面幾個東西的特性?使用場景?大概我不用再例舉了吧?對了,我多次被問到的一個問題是:synchronized 修飾實例方法和修飾靜態方法有啥不一樣。
JVM 類加載機制、垃圾回收算法對比、Java 虛擬機結構等。
這三個問題大概出現概率 40%,基本只需要看我每日一問系列的推文就差不多了吧,希望更清楚明白的可以直接看《深入理解 Java 虛擬機》。當你講到分代回收算法的時候,不免會被追問到新生對象是怎麼從年輕代到老年代的,以及可以作爲 root 結點的對象有哪些兩個問題。
Java 的四大引用
四大引用面試出現概率比我想象中要高,我原本以爲就強引用、軟引用、弱引用、虛引用這四個玩意兒沒啥可講的。實際上也確實沒啥好講的,稍微問的深一些的面試官會和內存泄漏檢測原理以及垃圾回收糅雜在一起。
Java 的泛型,<? super T> 和 <? extends T> 的區別。
Java 泛型還是會在面試中出現的,不過幾率不是很高,大概是因爲我簡歷中有提到泛型擦除相關的東西。所以會被問到泛型、泛型擦除、通配符相關的東西。不過這個東西,不應該是爲了應付面試,實際開發中真的很重要。
Java 線程有哪些狀態,有哪些鎖,各種鎖的區別。
這個問題講真,我也只懂一點皮毛,並且當時回答不是很全面,出現概率的話,不是很高吧。
final 、finally、finalize 區別。
老生常談的問題,沒啥好說的,實際上這次社招面試也只遇到了兩次。比較喜歡追根溯源的面試官可能會對這個 finalize 有點執念,一定希望搞清楚,這玩意兒我們是不是可以真的搞點黑科技騷操作。
接口和抽象類的區別。
沒想到還被問了一次這個,這玩意兒給我的感覺就是隨時都在用,但真要較真,還真不能一口氣把所有區別都信手拈來。
sleep 、wait、yield 的區別,wait 的線程如何喚醒它?
大多數 Android 應用開發並接觸不到很多併發相關的東西,不過這玩意兒還是在面試中挺容易出現的。

二、Android面試題

Android面試題包括Android基礎,還有一些源碼級別的、原理這些等。所以想去大公司面試,一定要多看看源碼和實現方式,常用框架可以試試自己能不能手寫實現一下,鍛鍊一下自己。

(一)Android基礎知識點

四大組件是什麼
四大組件的生命週期和簡單用法
Activity之間的通信方式
Activity各種情況下的生命週期
橫豎屏切換的時候,Activity 各種情況下的生命週期
Activity與Fragment之間生命週期比較
Activity上有Dialog的時候按Home鍵時的生命週期
兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
前臺切換到後臺,然後再回到前臺,Activity生命週期回調方法。彈出Dialog,生命值週期回調方法。
Activity的四種啓動模式對比
Activity狀態保存於恢復
fragment各種情況下的生命週期
Fragment狀態保存startActivityForResult是哪個類的方法,在什麼情況下使用?
如何實現Fragment的滑動?
fragment之間傳遞數據的方式?
Activity 怎麼和Service 綁定?
怎麼在Activity 中啓動自己對應的Service?
service和activity怎麼進行數據交互?
Service的開啓方式
請描述一下Service 的生命週期
談談你對ContentProvider的理解
說說ContentProvider、ContentResolver、ContentObserver 之間的關係
請描述一下廣播BroadcastReceiver的理解
廣播的分類
廣播使用的方式和場景
在manifest 和代碼中如何註冊和使用BroadcastReceiver?
本地廣播和全局廣播有什麼差別?
BroadcastReceiver,LocalBroadcastReceiver 區別
AlertDialog,popupWindow,Activity區別
Application 和 Activity 的 Context 對象的區別
Android屬性動畫特性
如何導入外部數據庫?
LinearLayout、RelativeLayout、FrameLayout的特性及對比,並介紹使用場景。
談談對接口與回調的理解
回調的原理
寫一個回調demo
介紹下SurfView
RecycleView的使用
序列化的作用,以及Android兩種序列化的區別
差值器
估值器
Android中數據存儲方式
面試題精編答案已經整理在了石墨文檔點擊前往領取:https://shimo.im/docs/PXhwVR6YY9tjwcrY
(二)Android源碼相關分析

Android動畫框架實現原理
Android各個版本API的區別
Requestlayout,onlayout,onDraw,DrawChild區別與聯繫
invalidate和postInvalidate的區別及使用
Activity-Window-View三者的差別
談談對Volley的理解
如何優化自定義View
低版本SDK如何實現高版本api?
描述一次網絡請求的流程
HttpUrlConnection 和 okhttp關係
Bitmap對象的理解
looper架構
ActivityThread,AMS,WMS的工作原理
自定義View如何考慮機型適配
自定義View的事件
AstncTask+HttpClient 與 AsyncHttpClient有什麼區別?
LaunchMode應用場景
AsyncTask 如何使用?
SpareArray原理
請介紹下ContentProvider 是如何實現數據共享的?
AndroidService與Activity之間通信的幾種方式
IntentService原理及作用是什麼?
說說Activity、Intent、Service 是什麼關係
ApplicationContext和ActivityContext的區別
SP是進程同步的嗎?有什麼方法做到同步?
談談多線程在Android中的使用
進程和 Application 的生命週期
封裝View的時候怎麼知道view的大小
RecycleView原理
AndroidManifest的作用與理解
(三)常見的一些原理性問題

Handler機制和底層實現
Handler、Thread和HandlerThread的差別
handler發消息給子線程,looper怎麼啓動?
關於Handler,在任何地方new Handler 都是什麼線程下?
ThreadLocal原理,實現及如何保證Local屬性?
請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係
請描述一下View事件傳遞分發機制
Touch事件傳遞流程
事件分發中的onTouch 和onTouchEvent 有什麼區別,又該如何使用?
View和ViewGroup分別有哪些事件分發相關的回調方法
View刷新機制
View繪製流程
自定義控件原理
自定義View如何提供獲取View屬性的接口?
Android代碼中實現WAP方式聯網
AsyncTask機制
AsyncTask原理及不足
如何取消AsyncTask?
爲什麼不能在子線程更新UI?
ANR產生的原因是什麼?
ANR定位和修正
oom是什麼?
什麼情況導致oom?
有什麼解決方法可以避免OOM?
Oom 是否可以try catch?爲什麼?
內存泄漏是什麼?
什麼情況導致內存泄漏?
如何防止線程的內存泄漏?
內存泄露場的解決方法
內存泄漏和內存溢出區別?
LruCache默認緩存大小
ContentProvider的權限管理(解答:讀寫分離,權限控制-精確到表級,URL控制)
如何通過廣播攔截和abort一條短信?
廣播是否可以請求網絡?
廣播引起anr的時間限制是多少?
計算一個view的嵌套層級
Activity棧
Android線程有沒有上限?
線程池有沒有上限?
ListView重用的是什麼?
Android爲什麼引入Parcelable?
有沒有嘗試簡化Parcelable的使用?
(四)開發中常見的一些問題

ListView 中圖片錯位的問題是如何產生的?
混合開發有了解嗎?
知道哪些混合開發的方式?說出它們的優缺點和各自使用場景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的瞭解一些前端js等還是很有好處的);
屏幕適配的處理技巧都有哪些?
服務器只提供數據接收接口,在多線程或多進程條件下,如何保證數據的有序到達?
動態佈局的理解
怎麼去除重複代碼?
畫出 Android 的大體架構圖
Recycleview和ListView的區別
ListView圖片加載錯亂的原理和解決方案
動態權限適配方案,權限組的概念
Android系統爲什麼會設計ContentProvider?
下拉狀態欄是不是影響activity的生命週期
如果在onStop的時候做了網絡請求,onResume的時候怎麼恢復?
Bitmap 使用時候注意什麼?
Bitmap的recycler()
Android中開啓攝像頭的主要步驟
ViewPager使用細節,如何設置成每次只初始化當前的Fragment,其他的不初始化?
點擊事件被攔截,但是想傳到下面的View,如何操作?
微信主頁面的實現方式
微信上消息小紅點的原理
面試題精編答案已經整理在了石墨文檔點擊前往領取:https://shimo.im/docs/PXhwVR6YY9tjwcrY

三、高級開發技術面試題

這裏講的是大公司需要用到的一些高端Android技術,這裏專門整理了一個文檔,希望大家都可以看看。這些題目有點技術含量,需要好點時間去研究一下的。

(一)圖片

圖片庫對比
圖片庫的源碼分析
圖片框架緩存實現
LRUCache原理
圖片加載原理
自己去實現圖片庫,怎麼做?
Glide源碼解析
Glide使用什麼緩存?
Glide內存緩存如何控制大小?
(二)網絡和安全機制

網絡框架對比和源碼分析
自己去設計網絡請求框架,怎麼做?
okhttp源碼
網絡請求緩存處理,okhttp如何處理網絡緩存的
從網絡加載一個10M的圖片,說下注意事項
TCP的3次握手和四次揮手
TCP與UDP的區別
TCP與UDP的應用
HTTP協議
HTTP1.0與2.0的區別
HTTP報文結構
HTTP與HTTPS的區別以及如何實現安全性
如何驗證證書的合法性?
https中哪裏用了對稱加密,哪裏用了非對稱加密,對加密算法(如RSA)等是否有了解?
client如何確定自己發送的消息被server收到?
談談你對WebSocket的理解
WebSocket與socket的區別
談談你對安卓簽名的理解。
請解釋安卓爲啥要加簽名機制?
視頻加密傳輸
App 是如何沙箱化,爲什麼要這麼做?
權限管理系統(底層的權限是如何進行 grant 的)?
(三)數據庫

sqlite升級,增加字段的語句
數據庫框架對比和源碼分析
數據庫的優化
數據庫數據遷移問題
(四)算法

排序算法有哪些?
最快的排序算法是哪個?
手寫一個冒泡排序
手寫快速排序代碼
快速排序的過程、時間複雜度、空間複雜度
手寫堆排序
堆排序過程、時間複雜度及空間複雜度
寫出你所知道的排序算法及時空複雜度,穩定性
二叉樹給出根節點和目標節點,找出從根節點到目標節點的路徑
給阿里2萬多名員工按年齡排序應該選擇哪個算法?
GC算法(各種算法的優缺點以及應用場景)
蟻羣算法與蒙特卡洛算法
子串包含問題(KMP 算法)寫代碼實現
一個無序,不重複數組,輸出N個元素,使得N個元素的和相加爲M,給出時間複雜度、空間複雜度。手寫算法
萬億級別的兩個URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應用層面對尋址的優化)
百度POI中如何試下查找最近的商家功能(提示:座標鏡像+R樹)。
兩個不重複的數組集合中,求共同的元素。
兩個不重複的數組集合中,這兩個集合都是海量數據,內存中放不下,怎麼求共同的元素?
一個文件中有100萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件中。說出最優的方法
一張Bitmap所佔內存以及內存佔用的計算
2000萬個整數,找出第五十大的數字?
燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
求1000以內的水仙花數以及40億以內的水仙花數
5枚硬幣,2正3反如何劃分爲兩堆然後通過翻轉讓兩堆中正面向上的硬8幣和反面向上的硬幣個數相同
時針走一圈,時針分針重合幾次
N*N的方格紙,裏面有多少個正方形
x個蘋果,一天只能吃一個、兩個、或者三個,問多少天可以吃完?
(五)插件化、模塊化、組件化、熱修復、增量更新、Gradle

對熱修復和插件化的理解
插件化原理分析
模塊化實現(好處,原因)
熱修復,插件化
項目組件化的理解
描述清點擊 Android Studio 的 build 按鈕後發生了什麼
(六)架構設計和設計模式

談談你對Android設計模式的理解
MVC MVP MVVM原理和區別
你所知道的設計模式有哪些?
項目中常用的設計模式
手寫生產者/消費者模式
寫出觀察者模式的代碼
適配器模式,裝飾者模式,外觀模式的異同?
用到的一些開源框架,介紹一個看過源碼的,內部實現過程。
談談對RxJava的理解
RxJava的功能與原理實現
RxJava的作用,與平時使用的異步操作來比的優缺點
說說EventBus作用,實現方式,代替EventBus的方式
從0設計一款App整體架構,如何去做?
說一款你認爲當前比較火的應用並設計(比如:直播APP,P2P金融,小視頻等)
談談對java狀態機理解
Fragment如果在Adapter中使用應該如何解耦?
Binder機制及底層實現
對於應用更新這塊是如何做的?(解答:灰度,強制更新,分區域更新)?
實現一個Json解析器(可以通過正則提高速度)
統計啓動時長,標準
(七)性能優化

如何對Android 應用進行性能分析以及優化?
ddms 和 traceView
性能優化如何分析systrace?
用IDE如何分析內存泄漏?
Java多線程引發的性能問題,怎麼解決?
啓動頁白屏及黑屏解決?
啓動太慢怎麼解決?
怎麼保證應用啓動不卡頓?
App啓動崩潰異常捕捉
自定義View注意事項
現在下載速度很慢,試從網絡協議的角度分析原因,並優化(提示:網絡的5層都可以涉及)。
Https請求慢的解決辦法(提示:DNS,攜帶數據,直接訪問IP)
如何保持應用的穩定性
RecyclerView和ListView的性能對比
ListView的優化
RecycleView優化
View渲染
Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
java中的四種引用的區別以及使用場景
強引用置爲null,會不會被回收?
(八)NDK、jni、Binder、AIDL、進程通信有關

請介紹一下NDK
什麼是NDK庫?
jni用過嗎?
如何在jni中註冊native函數,有幾種註冊方式?
Java如何調用c、c++語言?
jni如何調用java層代碼?
進程間通信的方式?
Binder機制
簡述IPC?
什麼是AIDL?
AIDL解決了什麼問題?
AIDL如何使用?
Android 上的 Inter-Process-Communication 跨進程通信時如何工作的?
多進程場景遇見過麼?
Android進程分類?
進程和 Application 的生命週期?
進程調度
談談對進程共享和線程安全的認識
談談對多進程開發的理解以及多進程應用場景
什麼是協程?
(九)framework層、ROM定製、Ubuntu、Linux之類的問題

java虛擬機的特性
談談對jvm的理解
JVM內存區域,開線程影響哪塊內存
對Dalvik、ART虛擬機有什麼瞭解?
Art和Dalvik對比
虛擬機原理,如何自己設計一個虛擬機(內存管理,類加載,雙親委派)
談談你對雙親委派模型理解
JVM內存模型,內存區域
類加載機制
談談對ClassLoader(類加載器)的理解
談談對動態加載(OSGI)的理解
內存對象的循環引用及避免
內存回收機制、GC回收策略、GC原理時機以及GC對象
垃圾回收機制與調用System.gc()區別
Ubuntu編譯安卓系統
系統啓動流程是什麼?(提示:Zygote進程 –> SystemServer進程 –> 各種系統服務 –> 應用進程)
大體說清一個應用程序安裝到手機上時發生了什麼
簡述Activity啓動全部過程
App啓動流程,從點擊桌面開始
邏輯地址與物理地址,爲什麼使用邏輯地址?
Android爲每個應用程序分配的內存大小是多少?
Android中進程內存的分配,能不能自己分配定額內存?
進程保活的方式
如何保證一個後臺服務不被殺死?(相同問題:如何保證service在後臺不被kill?)比較省電的方式是什麼?
App中喚醒其他進程的實現方式
面試題精編答案已經整理在了石墨文檔點擊前往領取:https://shimo.im/docs/PXhwVR6YY9tjwcrY

四、跨平臺Hybrid 開發

flutter
Html5項目實戰
HTML&CSS&JavaScript 實戰
WordPress搭建網站項目實戰
前端Vue架構
前端樣式開發
Weex內置能力
Weex原生應用
Weex擴展框架
WeexUI架構
介紹你做過的哪些項目
都使用過哪些框架、平臺?
都使用過哪些自定義控件?
研究比較深入的領域有哪些?
對業內信息的關注渠道有哪些?
最近都讀哪些書?
有沒有什麼開源項目?
自己最擅長的技術點,最感興趣的技術領域和技術點
項目中用了哪些開源庫,如何避免因爲引入開源庫而導致的安全性和穩定性問題
實習過程中做了什麼,有什麼產出?
面試題精編答案已經整理在了石墨文檔點擊前往領取:https://shimo.im/docs/PXhwVR6YY9tjwcrY

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章