Android高級工程師面試題整理
阿新 • • 發佈:2019-03-29
cdn 劃分 oop 正方 技術 互聯網 修改 int 增量
這些題目是網友去百度、小米、樂視、美團、58、獵豹、360、新浪、搜狐等一線互聯網公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的幾率。
主要分為以下幾部分:
(1)java面試題
(2)Android面試題
(3)高級開發技術面試題
(4)跨平臺Hybrid 開發
一、java面試題
熟練掌握java是很關鍵的,大公司不僅僅要求你會使用幾個api,更多的是要你熟悉源碼實現原理,甚至要你知道有哪些不足,怎麽改進,還有一些java有關的一些算法,設計模式等等。
(一) java基礎面試知識點
- java中==和equals和hashCode的區別
- int、char、long各占多少字節數
- int與integer的區別
- 探探對java多態的理解
- String、StringBuffer、StringBuilder區別
- 什麽是內部類?內部類的作用
- 抽象類和接口區別
- 抽象類的意義
- 抽象類與接口的應用場景
- 抽象類是否可以沒有方法和屬性?
- 接口的意義
- 泛型中extends和super的區別
- 父類的靜態方法能否被子類重寫
- 進程和線程的區別
- final,finally,finalize的區別
- 序列化的方式
- Serializable 和Parcelable 的區別
- 靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
- 靜態內部類的設計意圖
- 成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用
- 談談對kotlin的理解
- 閉包和局部內部類的區別
- string 轉換成 integer的方式及原理
(二) java深入源碼級的面試題(有難度)
- 哪些情況下的對象會被垃圾回收機制處理掉?
- 講一下常見編碼方式?
- utf-8編碼中的中文占幾個字節;int型幾個字節?
- 靜態代理和動態代理的區別,什麽場景使用?
- Java的異常體系
- 談談你對解析與分派的認識。
- 修改對象A的equals方法的簽名,那麽使用HashMap存放這個對象實例的時候,會調用哪個equals方法?
- Java中實現多態的機制是什麽?
- 如何將一個Java對象序列化到文件裏?
- 說說你對Java反射的理解
- 說說你對Java註解的理解
- 說說你對依賴註入的理解
- 說一下泛型原理,並舉例說明
- Java中String的了解
- String為什麽要設計成不可變的?
- Object類的equal和hashCode方法重寫,為什麽?
(三) 數據結構
- 常用數據結構簡介
- 並發集合了解哪些?
- 列舉java的集合以及集合之間的繼承關系
- 集合類以及集合框架
- 容器類介紹以及之間的區別(容器類估計很多人沒聽這個詞,Java容器主要可以劃分為4個部分:List列表、Set集合、Map映射、工具類(Iterator叠代器、Enumeration枚舉類、Arrays和Collections),具體的可以看看這篇博文 Java容器類)
- List,Set,Map的區別
- List和Map的實現方式以及存儲方式
- HashMap的實現原理
- HashMap數據結構?
- HashMap源碼理解
- HashMap如何put數據(從HashMap源碼角度講解)?
- HashMap怎麽手寫實現?
- ConcurrentHashMap的實現原理
- ArrayMap和HashMap的對比
- HashTable實現原理
- TreeMap具體實現
- HashMap和HashTable的區別
- HashMap與HashSet的區別
- HashSet與HashMap怎麽判斷集合元素重復?
- 集合Set實現Hash怎麽防止碰撞
- ArrayList和LinkedList的區別,以及應用場景
- 數組和鏈表的區別
- 二叉樹的深度優先遍歷和廣度優先遍歷的具體實現
- 堆的結構
- 堆和樹的區別
- 堆和棧在內存中的區別是什麽(解答提示:可以從數據結構方面以及實際實現方面兩個方面去回答)?
- 什麽是深拷貝和淺拷貝
- 手寫鏈表逆序代碼
- 講一下對樹,B+樹的理解
- 講一下對圖的理解
- 判斷單鏈表成環與否?
- 鏈表翻轉(即:翻轉一個單項鏈表)
- 合並多個單有序鏈表(假設都是遞增的)
(四) 線程、多線程和線程池
- 開啟線程的三種方式?
- 線程和進程的區別?
- 為什麽要有線程,而不是僅僅用進程?
- run()和start()方法區別
- 如何控制某個方法允許並發訪問線程的個數?
- 在Java中wait和seelp方法的不同;
- 談談wait/notify關鍵字的理解
- 什麽導致線程阻塞?
- 線程如何關閉?
- 講一下java中的同步的方法
- 數據一致性如何保證?
- 如何保證線程安全?
- 如何實現線程同步?
- 兩個進程同時要求寫或者讀,能不能實現?如何防止進程的同步?
- 線程間操作List
- Java中對象的生命周期
- Synchronized用法
- synchronize的原理
- 談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解
- static synchronized 方法的多線程訪問和作用
- 同一個類裏面兩個synchronized方法,兩個線程同時訪問的問題
- volatile的原理
- 談談volatile關鍵字的用法
- 談談volatile關鍵字的作用
- 談談NIO的理解
- synchronized 和volatile 關鍵字的區別
- synchronized與Lock的區別
- ReentrantLock 、synchronized和volatile比較
- ReentrantLock的內部實現
- lock原理
- 死鎖的四個必要條件?
- 怎麽避免死鎖?
- 對象鎖和類鎖是否會互相影響?
- 什麽是線程池,如何使用?
- Java的並發、多線程、線程模型
- 談談對多線程的理解
- 多線程有什麽要註意的問題?
- 談談你對並發編程的理解並舉例說明
- 談談你對多線程同步機制的理解?
- 如何保證多線程讀寫文件的安全?
- 多線程斷點續傳原理
- 斷點續傳的實現
(五)並發編程有關知識點(這個是一般Android開發用的少的,所以建議多去看看):
平時Android開發中對並發編程可以做得比較少,Thread這個類經常會用到,但是我們想提升自己的話,一定不能停留在表面,,我們也應該去了解一下java的關於線程相關的源碼級別的東西。
附;java進階與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中數據存儲方式
(二)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,如何操作?
- 微信主頁面的實現方式
- 微信上消息小紅點的原理
- CAS介紹(這是阿裏巴巴的面試題,我不是很了解,可以參考博客: CAS簡介)
附;AndroidAPP開發框架技術體系大綱;
三、高級開發技術面試題
這裏講的是大公司需要用到的一些高端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中喚醒其他進程的實現方式
附;性能調優+前沿技術+NDK技術大綱
四、跨平臺Hybrid 開發
- flutter
- Html5項目實戰
- HTML&CSS&JavaScript 實戰
- WordPress搭建網站項目實戰
- 前端Vue架構
- 前端樣式開發
- Weex內置能力
- Weex原生應用
- Weex擴展框架
- WeexUI架構
- 介紹你做過的哪些項目
- 都使用過哪些框架、平臺?
- 都使用過哪些自定義控件?
- 研究比較深入的領域有哪些?
- 對業內信息的關註渠道有哪些?
- 最近都讀哪些書?
- 有沒有什麽開源項目?
- 自己最擅長的技術點,最感興趣的技術領域和技術點
- 項目中用了哪些開源庫,如何避免因為引入開源庫而導致的安全性和穩定性問題
- 實習過程中做了什麽,有什麽產出?
附;跨平臺Hybrid 開發技術大綱
五、小結
由於題目很多整理答案的工作量太大,所以僅限於提供知識點,如果你正在找工作,建議逐個過一遍,不懂的可以群裏提問討論,但是請先自行上網查閱相關知識點,對於已經掌握的可以忽略以節省時間。
Android高級工程師面試題整理