面試:如果不準備充分的面試,完全是浪費時間,更是對自己的不負責!
如果想變得優秀那就去看那些優秀的人在學什麼,做什麼,想盡一切辦法和他們交流;多出去看看這個世界,然後把自己逼到往死裏學。
如今已是五月底,馬上即將迎來六月份的畢業季,大批的屆畢業生即將進入求職面試的緊張階段,在這裏分享一下我從事Android多年以來的面試經驗。
這篇攻略是我從事開發工作七八年來,去面試,以及面試別人的經驗總結。其中大部分都是大企業面試常問的面試題,可以對照這查漏補缺,當然了,這裏所列的肯定不可能覆蓋全部方式,希望對大家找工作有幫助!
文末會給大家分享我整理的Android面試專題及答案(這些題我基本都刷了三遍以上,畢竟之前的年前突然裁員風波心裏是有點迷)
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
- 快應用
性能優化
- 如何對 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 的理解
- 閉包和局部內部類的區別?
數據結構與算法
數據結構
- 簡述常見的數據結構?
- 堆的結構?
- 樹、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)然後面試官一直問你方案是怎麼做的
- 遇到面試官敷衍隨便問問題
想要面試順通嘛,關注我的主頁個人說明獲取面試資料爲面試做足準備叭!這裏提前祝各位應屆畢業生面試成功!