馬上又到了金三銀四了,整理了一些面試題分,希望對大家有所幫助 ~
雖然我不推薦大家刷題,這裏僅供大家差缺補漏。所有的知識點還是重在自己理解,用自己的方式表達出來比較好。
Java 知識
基礎
- 什麼是面向對象(OOP)?
- 什麼是多態?實現多態的機制是什麼?
- 接口(Interface)與抽象類(Abstract Class)的區別?
- 重寫(Override)與重載(Overload)的區別?
- 父類的靜態方法能否被子類重寫?
- 靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?爲什麼?
- 什麼是內部類?內部類、靜態內部類、局部內部類和匿名內部類的區別及作用?
- == 和 equals() 和 hashCode() 的區別?
- Integer 和 int 之間的區別?
- String 轉換成 Integer 的方式及原理?
- 自動裝箱實現原理?類型轉換實現原理?
- 對 String 的瞭解?
- String 爲什麼要設計成不可變的?
- final、finally 和 finalize 的區別?
- static 關鍵字有什麼作用?
- 列舉 Java 的集合以及集合之間的繼承關係?
- List、Set、Map 的區別?
- ArrayList、LinkedList 的區別?
- HashMap,HashTable,ConcurrentHashMap 實現原理以及區別?
- HashSet 與 HashMap 怎麼判斷集合元素重複?
- String、StringBuffer、StringBuilder 之間的區別?
- 什麼是序列化?怎麼實現?有哪些方式?
- 對反射的瞭解?
- 對註解的瞭解?
- 對依賴注入的瞭解?
- 對泛型的瞭解?
- 泛型中 extends 和 super 的區別?
- 對 Java 的異常體系的瞭解?
- 對解析與分派的瞭解?
- 靜態代理和動態代理的區別?有什麼場景使用?
- 談談對 Java 狀態機理解?
線程與併發
- 線程和進程的區別?
- 開啓線程的三種方式
- 如何正確的結束一個Thread?
- Thread 與 Runnable 的區別?
- run() 與 start() 方法的區別?
- sleep() 與 wait() 方法的區別?
- wait 與 notify 關鍵字的區別?
- synchronized 關鍵字的用法、作用及實現原理?
- volatile 關鍵字的用法、作用及實現原理?
- transient 關鍵字的用法、作用及實現原理?
- ReentrantLock、synchronized、volatile 之間的區別?
- 什麼是線程池,如何使用?
- 多線程斷點續傳的實現原理?
- 什麼是深拷貝和淺拷貝?
- Java 中對象的生命週期?
- 對併發編程的瞭解?
JVM
- 簡述 JVM 內存模型和內存區域?
- 簡述垃圾回收器的工作原理?
- 如何判斷對象的生死?垃圾回收算法?新生代,老生代?
- 哪些情況下的對象會被垃圾回收機制處理掉?
- 垃圾回收機制與調用 System.gc() 的區別?
- 強引用、軟引用、弱引用、虛引用之間的區別?
- 強引用設置爲 null,會不會被回收?
- 簡述 ClassLoader 類加載機制?
- 對雙親委派模型的瞭解?
- String a = “a”+“b”+“c” 在內存中創建幾個對象?
- 對 Dalvik、ART 虛擬機的瞭解?
- 對動態加載(OSGI)的瞭解?
- 常見編碼方式有哪些?
- utf-8 編碼中的中文佔幾個字節?int 型佔幾個字節?
Android 知識
基礎
- 四大組件是什麼?
- Activity 的生命週期?
- Activity 之間的通信方式?
- Activity 各種情況下的生命週期?
- 橫豎屏切換時 Activity 的生命週期
- 前臺切換到後臺,然後再回到前臺時 Activity 的生命週期
- 彈出 Dialog 的時候按 Home 鍵時 Activity 的生命週期
- 兩個 Activity 之間跳轉時的生命週期
- 下拉狀態欄時 Activity 的生命週期
- Activity 與 Fragment 之間生命週期比較?
- Activity 的四種 LaunchMode(啓動模式)的區別?
- Activity 狀態保存與恢復?
- Fragment 各種情況下的生命週期?
- Activity 和 Fragment 之間怎麼通信, Fragment 和 Fragment 怎麼通信?
- Service 的生命週期?
- Service 的啓動方式?
- Service 與 IntentService 的區別?
- Service 和 Activity 之間的通信方式?
- 對 ContentProvider 的理解?
- ContentProvider、ContentResolver、ContentObserver 之間的關係?
- 對 BroadcastReceiver 的瞭解?
- 廣播的分類?使用方式和場景?
- 動態廣播和靜態廣播有什麼區別?
- AlertDialog、popupWindow、Activity 之間的區別?
- Application 和 Activity 的 Context 之間的區別?
- Android 屬性動畫特性?
- 請列舉 Android 中常見的佈局(Layout)類型,並簡述其用法,以及排版效率。【獵豹移動】
LinearLayout、RelativeLayout、FrameLayout 的特性對比及使用場景? - 對 SurfaceView 的瞭解?
- Serializable 和 Parcelable 的區別?
- Android 中數據存儲方式有哪些?
- 屏幕適配的處理技巧都有哪些?
- Android 各個版本 API 的區別?
- 動態權限適配方案,權限組的概念?
- 爲什麼不能在子線程更新 UI?
- ListView 圖片加載錯亂的原理和解決方案?
- 對 RecycleView 的瞭解?
- Recycleview 和 ListView 的區別?
- RecycleView 實現原理?
- Android Manifest 的作用與理解?
- 多線程在 Android 中的使用?
- 區別 Animation 和 Animator 的用法,概述實現原理?【獵豹移動】
進階
- 畫出 Android 的大體架構圖
- 低版本 SDK 如何使用高版本 API?
- AsyncTask 如何使用?
- AsyncTask 機制、原理及不足?
- 如果在 onStop() 的時候做了網絡請求,onResume() 的時候怎麼恢復?
- Handler 機制和底層實現?
- Handler、Thread、HandlerThread 區別?
Thread、Looper、MessageQueue、Handler、Message,每個類的功能是什麼,這些類之間是什麼關係?【獵豹移動】 - ThreadLocal 原理、實現及如何保證 Local 屬性?
- 自定義 View 的流程?如何機型適配?
- 自定義 View 的時怎麼獲取 View 的大小?
- View 的繪製流程?
- View 的事件傳遞分發機制?
- requestLayout(),onLayout(),onDraw(),drawChild() 區別與聯繫?
- invalidate() 和 postInvalidate() 的區別?
- 如何計算一個 View 的嵌套層級?
- Android 動畫框架及實現原理?
- 進程和 Application 的生命週期的關係?
- SpareArray 的實現原理?
- SharedPreferences 的實現眼裏?是否進程同步?如何做到同步?
- ContentProvider 是如何實現數據共享的?
- ContentProvider 的權限管理?
- Android 系統爲什麼會設計 ContentProvider?
- Android 線程有沒有上限?
- 怎麼去除重複代碼?
- Android 中開啓攝像頭的主要流程?
- 對 Bitmap 對象的瞭解?
- 圖片加載原理?
- 圖片壓縮原理?
- 圖片框架實現原理?LRUCache 原理?
- EventBus 實現原理?
- ButterKnife 實現原理?
- Volley 實現原理?
- okhttp 實現原理?
- 服務器只提供數據接收接口,在多線程或多進程條件下,如何保證數據的有序到達?
- SQLite 數據庫升級,數據遷移問題?
- 數據庫框架對比和源碼分析?
- CAS介紹,OAuth 授權機制?
- 談談你對安卓簽名的理解
- App 是如何沙箱化,爲什麼要這麼做?
混合開發
- 混合開發的方式?各自優缺點和使用場景?
- Hybird
- React Native
- Weex
- Flutter
- Dart
- 快應用
Framework
- 請介紹一下 NDK?
- 如何加載 ndk 庫?如何在 jni 中註冊 native 函數,有幾種註冊方式?【獵豹移動】
- Android 進程分類?
- 談談對進程共享和線程安全的認識?
- 談談對多進程開發的理解以及多進程應用場景?
- 什麼是協程?
- 邏輯地址與物理地址,爲什麼使用邏輯地址?
- Android 爲每個應用程序分配的內存大小是多少?
- 進程保活的方式?
- 系統啓動流程是什麼?
- 一個應用程序安裝到手機上的過程發生了什麼?
- App 啓動流程,從點擊桌面開始(Activity 啓動流程)?
- 什麼是 AIDL?解決了什麼問題?如何使用?
- Binder 機制及工作原理?
- App 中喚醒其他進程的實現方式?
- Activity、Window、View 三者的關係與區別?
- ApplicationContext 和 ActivityContext 的區別?
- ActivityThread,ActivityManagerService,WindowManagerService 的工作原理?
- PackageManagerService 的工作原理?
- PowerManagerService 的工作原理?
- 權限管理系統(底層的權限是如何進行 grant 的)?
- 操作系統中進程和線程有什麼區別?系統在什麼情況下會在用戶態和內核態中切換?【獵豹移動】
- 如果一個 App 裏面有多個進程存在,請列舉你所知道的全部 IPC 方法。
性能優化
- 如何對 Android 應用進行性能分析以及優化?
- ANR 產生的原因是什麼?怎麼定位?
- OOM 是什麼?怎麼解決?是否可以 try catch?
- 內存泄露的解決方法?
- ddms 和 traceView 的使用?
- 性能優化如何分析 systrace?
- 用 IDE 如何分析內存泄漏?
- Java 多線程引發的性能問題,怎麼解決?
- 啓動頁白屏、黑屏、太慢怎麼解決?
- App 啓動崩潰異常怎麼捕捉?
對於 Android App 閃退,可能有哪些原因?請針對每種情況簡述分析過程。【獵豹移動】 - 如何保持應用的穩定性?
- RecyclerView 和 ListView 的性能對比?
- Bitmap 如何處理大圖?如何預防 OOM?
- 如何縮小 Apk 的體積?
- 如何統計啓動時長?
Gradle
- Gradle 源碼解析
- 對熱修復和插件化的理解?
- 插件化原理分析
- 模塊化實現(好處,原因)
- 項目組件化的理解
- 描述清點擊 Android Studio 的 build 按鈕後發生了什麼?
Kotlin
- 談談對 Kotlin 的理解
- 閉包和局部內部類的區別?
網絡基礎
- 描述一次網絡請求的流程?
- TCP 中 3 次握手和 4 次揮手的過程?
- TCP 與 UDP 的區別及應用?
- HTTP 協議
- HTTP 1.0 與 2.0 的區別
- HTTP 報文結構
- HTTP 與 HTTPS 的區別以及如何實現安全性
- HTTPS 原理
- 談談你對 WebSocket 的理解
- WebSocket 與 socket 的區別
- 視頻加密傳輸
數據結構與算法
數據結構
- 簡述常見的數據結構?
- 堆的結構?
- 樹、B+ 樹、二叉樹、紅黑樹的瞭解?
- 二叉樹的深度優先遍歷和廣度優先遍歷?
- 堆和樹的區別?
- 圖的瞭解?
算法
- 排序算法有哪些?
- 最快的排序算法是哪個?
- 手寫冒泡排序
- 手寫快速排序
- 快速排序的過程、時間複雜度、空間複雜度
- 手寫堆排序
常見算法問題
- 給阿里2萬多名員工按年齡排序應該選擇哪個算法?
- GC算法(各種算法的優缺點以及應用場景)
- 蟻羣算法與蒙特卡洛算法
- 子串包含問題(KMP 算法)寫代碼實現
- 一個無序,不重複數組,輸出N個元素,使得N個元素的和相加爲M,給出時間複雜度、空間複雜度。手寫算法
- 萬億級別的兩個URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應用層面對尋址的優化)
- 兩個不重複的數組集合中,求共同的元素。
- 兩個不重複的數組集合中,這兩個集合都是海量數據,內存中放不下,怎麼求共同的元素?
- 一個文件中有100萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件中。說出最優的方法
- 一張Bitmap所佔內存以及內存佔用的計算
- 2000萬個整數,找出第五十大的數字?
- 求1000以內的水仙花數以及40億以內的水仙花數
- 燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
- 5枚硬幣,2正3反如何劃分爲兩堆然後通過翻轉讓兩堆中正面向上的硬8幣和反面向上的硬幣個數相同
- 時針走一圈,時針分針重合幾次
設計模式與架構
設計模式
- 談談你對 Android 設計模式的理解
- 項目中常用的設計模式有哪些?
- 手寫生產者-消費者模式?
- 手寫觀察者模式?
- 適配器模式、裝飾者模式、外觀模式的異同?
架構
- MVC、MVP、MVVM 原理和區別?
請畫出 MVC、MVP 的差異?【獵豹移動】 - 對 RxJava 的理解,功能與原理,優缺點?
- 從 0 設計一款 App 整體架構,如何去做?
- Fragment 如果在 Adapter 中使用應該如何解耦?
- 對於應用更新這塊是如何做的?(解答:灰度,強制更新,分區域更新)?
- 實現一個 Json 解析器(可以通過正則提高速度)?
其他方面
人事相關
- 請簡單做個自我介紹?
- 爲什麼離開上家公司?您在前一家公司的離職原因是什麼?
- 爲什麼要做 xxx 崗位(出現所學專業與求職崗位不同時提問)?
- 講一個你認爲做的最好的項目/案例
- 你應聘該崗位的優勢是什麼?
- 你上家公司的薪水/期望的薪金?
- 你對薪資的要求?
- 談談你對跳槽的看法?
- 對待加班看法?
- 自己最擅長的技術點,最感興趣的技術領域和技術點,做了那些東西?
- 自己的優點和缺點是什麼?並舉例說明?
- 你朋友對你的評價?
- 說下項目中遇到的棘手問題,包括技術,交際和溝通?
項目中遇到最大的困難是什麼?如何解決的? - 在五年的時間內,你的職業規劃?
- 給你一個項目,你怎麼看待他的市場和技術的關係?
- 你一般喜歡從什麼渠道獲取技術信息和提高自己的能力?
你的學習方法是什麼樣的?實習過程中如何學習?實習項目中遇到的最大困難是什麼以及如何解決的? - 如果實際工作後發現自己不適合這個職位怎麼辦?
如果通過這次面試我們單位錄用了你,但工作一段時間卻發現你根本不適合這個職位,你怎麼辦? - 工作上與領導意見不同時,怎麼辦?
- 如果你的主管搶了你的功勞你該怎樣?
- 若上司在公開會議上誤會你了,該如何解決?
- 工作中你難以和同事、上司相處,你該怎麼辦?
- 因成績比較突出,受同事們孤立你怎麼看?
- 你和別人發生過爭執嗎?你是怎樣解決的?
- 如果工作失誤,給公司造成經濟損失,你該怎麼辦?
- 你對於我們公司瞭解多少?
- 你爲什麼願意到我們公司來工作?
- 你能爲我們公司帶來什麼?
- 你最擅長的技術點,最感興趣的技術領域和技術點?
- 說說你對行業、技術發展趨勢的看法?
- 理想中的工作環境是什麼?
- 說說你的家庭?
- 就你申請的這個職位,你認爲你還欠缺什麼?
- 你做過的哪件事最令自己感到驕傲?說一件最能證明你能力的事情?
- 對這項工作,你有哪些可預見的困難?
- 如果被錄用,你將怎樣開展工作?
- 希望與什麼樣的上級共事?
- 你工作經驗欠缺,如何能勝任這項工作?
- 如果你在這次面試中沒有被錄用,你怎麼打算?
- 除了本公司外,還應聘了哪些公司?
- 你還要什麼瞭解和要問的嗎?
- 實習過程中周圍同事/同學有哪些值得學習的地方?
- 是否可以實習,可以實習多久?
- 實習過程中做了什麼,有什麼產出?
- 公司實習最大的收穫是什麼?
- 評價下自己,評價下自己的技術水平,個人代碼量如何?
- 當前的 offer 狀況;如果 BATH 都給了offer 該如何選?
- 你對一份工作更看重哪些方面?平臺,技術,氛圍,城市,還是 money?
- 假如你晚上要去送一個出國的同學去機場,可單位臨時有事非你辦不可,你怎麼辦?
- 你看中公司的什麼?或者公司的那些方面最吸引你?
- 講一件你印象最深的一件事情?
- 介紹你做過的哪些項目,介紹一個你影響最深的項目?
- 你做過的哪件事最令自己感到驕傲?
- 都使用過哪些框架、平臺?
- 都使用過哪些自定義控件?
- 項目中用了哪些開源庫,如何避免因爲引入開源庫而導致的安全性和穩定性問題?
- 有沒有什麼開源項目?
- 研究比較深入的領域有哪些?
- 對業內信息的關注渠道有哪些?
- 業餘都有哪些愛好?
- 最近都讀哪些書?
- 你的夢想是什麼?
常見套路
如果有遇到以下這些情況,你可以繼續投簡歷:
- 我們 xx 總不在,會叫 hr 聯繫你,你先回去等通知
- 面試叫你帶上以往作品(工作成績需要以往作品展示的除外,如:ui)然後面試官一直問你方案是怎麼做的
- 遇到面試官敷衍隨便問問題
項目介紹
https://github.com/android-exchange/Android-Interview
所有的面試題都放在 Android-Interview 項目上,該項目是由 現滴滴出行終端技術首席架構師 - 任玉剛 領導組織,我與多位 Android 大佬共同維護的項目。
該項目持續更新,歡迎大家 Star,如果有更優質的面試題歡迎聯繫我提交。
我的 GitHub
我的公衆號
歡迎關注我的公衆號,分享各種技術乾貨,各種學習資料,職業發展和行業動態。
技術交流羣
歡迎加入技術交流羣,來一起交流學習。