南塵在 2019 年 7 月毫無準備的狀況下也參加了幾家一線互聯網公司的面試,包括阿里、頭條、快手、趣頭條、BIGO、訊飛、OPPO,也熙熙攘攘拿了幾個 offer,最終選取了其中一家公司進行入職。面試
每次面試後,其實也有進行面試題的一些收集和總結,確實,面試其實就是一次查漏補缺的過程。本着對公司負責的態度,這裏就不說面試題來自哪家公司了。不過仍是要把記錄下來的這些真題分享給你們。算法
另外,面試題通常都是基礎 && 項目兩部分結合,並且還要看面試官當時對你的準備,因此面試真題雖然「真」,但卻僅僅只能做爲你們準備面試的一個大綱吧。編程
固然,有些題目沒記錄徹底,有些題目也出現多家公司提問,這裏就不重複了。數組
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 應用開發並接觸不到不少併發相關的東西,不過這玩意兒仍是在面試中挺容易出現的。
計算機網絡部分。
計算機網絡部分仍是挺容易考察的,不過考察的點不會那麼深刻。一般來講也就是這些問題:緩存
- TCP 有哪些狀態。
- 三次握手、四次揮手。爲啥是三次不是兩次?
- HTTPS 和 HTTP 的區別。HTTPS 2.0,3.0?
- 瀏覽器輸入一個 URL,按下回車網絡傳輸的流程?
- 喜歡深問一點的還會問到網絡架構,每層有些什麼協議,FTP 這些相關原理,印象比較深入的還有一個問題是:TCP 創建鏈接後,發包頻率是怎樣的?
Android 部分
Android 很廣,因此這裏只是簡單說下有些什麼問題。這個的話其實真的 70% 問題出自你的簡歷。性能優化
- Activity 的生命週期;
- Android 的 4 大啓動模式,注意
onNewIntent()
的調用;
- 組件化架構思路,如何從一個老項目一步一步實現組件化,主要問實現思路,考察應試者的架構能力和思考能力。 這一塊內容真的不少,你須要考慮的問題不少,哪一步作什麼,順序很重要。
- MVC、MCP、MVVP 的區別和各類使用場景,如何選擇適合本身的開發架構?
- Router 原理,如何實現組件間通訊,組件化平級調用數據方式。
- 系統打包流程;
- APP 啓動流程;
- 如何作啓動優化? 冷啓動什麼的確定是基礎,後續應該還有的是懶加載,丟線程池同步處理,須要注意這裏可能會有的坑是,丟線程池如何知道所有完成。
- 事件分發機制。 事件分發已經不是直接讓你講了,會給你具體的場景,好比 A 嵌套 B ,B 嵌套 C,從 C 中心按下,一下滑出到 A,事件分發的過程,這裏面確定會有 ACTION_CANCEL 的相關調用時機。
- 如何檢測卡頓,卡頓原理是什麼,怎麼判斷是頁面響應卡頓仍是邏輯處理形成的卡頓?
- 生產者模式和消費者模式的區別?
- 單例模式雙重加鎖,爲何要這樣作。
- Handler 機制原理,IdleHandler 何時調用。
- LeakCanary 原理,爲何檢測內存泄漏須要兩次?
- BlockCanary 原理。
- ViewGroup 繪製順序;
- Android 有哪些存儲數據的方式。
- SharedPrefrence 源碼和問題點;
- 講講 Android 的四大組件;
- 屬性動畫、補間動畫、幀動畫的區別和使用場景;
- 自定義 ViewGroup 如何實現 FlowLayout?如何實現 FlowLayout 調換順序?
- 自定義 View 如何實現打桌球效果;
- 自定義 View 如何實現拉弓效果,貝瑟爾曲線原理實現?
- APK 瘦身是怎麼作的,只用 armabi-v7a 沒有什麼問題麼? APK 瘦身這個基本是 100% 被面試問到,多是我簡歷上提到的緣由。
- ListView 和 RecyclerView 區別?RecyclerView 有幾層緩存,如何讓兩個 RecyclerView 共用一個緩存?
- 如何判斷一個 APP 在前臺仍是後臺?
- 如何作應用保活?全家桶原理?
- 講講你所作過的性能優化。
- Retrofit 在 OkHttp 上作了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的。
- 講講軌跡視頻的音視頻合成原理;
- AIDL 相關;
- Binder 機制,講講 Linux 上的 IPC 通訊,Binder 有什麼優點,Android 上有哪些多進程通訊機制?
- RxJava 的線程切換原理。
- OkHttp 和 Volloy 區別;
- Glide 緩存原理,如何設計一個大圖加載框架。
- LRUCache 原理;
- 講講咕咚項目開發中遇到的最大的一個難題和挑戰; 這個問題基本是 95% 必問的一個問題;
- 說說你開發最大的優點點。 出現率同上。
算法
- String 轉 int。 核心算法就三行代碼,不過臨界條件不少,除了判空,還須要注意負數、Integer 的最大最小值邊界等;
- 如何判斷一個單鏈表有環?
- 鏈表翻轉;
- 快排;
- 100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;
- 鏈表每 k 位逆序;
- 鏡像二叉樹;
- 找出一個無序數組中出現超過一半次數的數字;
- 計算二叉樹的最大深度,要求非遞歸算法。
- String 方式計算加法。
HR 面
- 你爲何離開咕咚?
- 你的缺點是什麼?
- 你能給公司帶來什麼效益?
- 你對將來的職業規劃?