Android史上最全面試題

tongasheng發表於2019-01-14

本文轉自: <embed>

我把面試的問題分為java基礎、Android知識點、資料結構與演算法、專案相關的問題四部分。

java基礎這部分很重要,這個看你基本功,去大公司面試比較注重基礎,所以這部分會問的比較多,jvm問的挺多,執行緒池這塊也是重點,還有,大公司面試還會問你併發這塊的知識點,比如鎖機制,一些volatile、synchronized關鍵字用來做什麼的,內部實現原理等問題。

Android知識點,這塊自然不用多說,肯定是面試的重災區。去大公司面試都都喜歡問你原始碼、內部實現,這樣的問題。所以,handler,asynctask這樣常用的API內部原理必須會,面試官還經常問你看過哪些開源框架的原始碼,所以你得熟悉幾個開源框架的內部實現,比如volley、retrofit、OkHttp、butterknife、glide。Android還是要做多專案積累經驗。

資料結構與演算法這部分是我的弱項,多扯兩句,這部分是去大公司面試的必問問題,博主去美團、百度面試都讓演算法給刷掉了,所以這塊很重要,要想進大公司演算法是繞不過去的,雖然Android一般用不到太多、太複雜的演算法。我在面試題中,關於演算法這塊我也寫了幾個,比如排序,二分查詢,面試小公司,可能會讓你寫個什麼氣泡排序,快排,二分查詢,但是進大公司面試,面試官根本不問這些最普通的面試問題,他們都會自己給你出一個題,讓你寫出最優演算法,平時多看看《劍指offer》、刷LeetCode。演算法也是我的弱項,我就不在這裡侃了。資料結構,也是很重要的!常用的資料結構(ArrayList、LinkedList、HashMap)內部實現都得知道,能跟面試官侃侃而談,還有延伸的一些資料結構你也得有所瞭解,比如問到HashMap都知道他不是執行緒安全的,那執行緒安全的ConcurrentHashMap,你知道內部的機制,他是怎麼來保證執行緒安全的前提下,最大的提高讀寫效率的呢?還有Android特有的資料結構SparseArray等一些原理。瞭解資料結構內部實現其實挺好的,對編碼有幫助。

專案相關的問題,這部分基本都是在二面、三面上吧(終於過了一年了),這塊你就跟面試官聊聊你做的專案,用到了什麼技術,怎麼來解決問題啥的,這個針對自己專案來說就行,就不多說了。

面試要點寫完了,來一句感受:面試搬大象,幹活擰螺絲!

今天臨時想到的基本都是這些,最後奉獻上我積累幾年的面試題[無私],祝願各位都能拿到不錯的offer。

Java

1. jvm垃圾回收機制

2. hashCode()和equals()

Java hashCode() 和 equals()的若干問題解答

3. java記憶體管理

Java進階10 記憶體管理與垃圾回收

java記憶體最佳化
  • 釋放連線
  • 最佳化邏輯,釋放不必要的物件 儘量使用區域性變數
  • 減少迴圈邏輯裡的物件的建立
  • 基本型別代替物件型別
  • 使用stringBuffer和stringBuilder替代多次String物件
  • 單執行緒儘量使用hashmap和ArrayList
  • 提前分配stringBuffer,陣列,array,vector等容量
  • 合適的場所使用單例
  • 儘量不要隨意使用靜態變數
  • 處理記憶體洩露

4.執行緒池

執行緒池,這一篇或許就夠了

5. 程式和執行緒的關係

6. Thread和Runnable的區別

java執行緒(上)Thread和Runnable的區別

7. 死鎖

java 死鎖及解決
【Java併發程式設計】之九:死鎖(含程式碼)

8. 單例

JAVA設計模式之單例模式

9. 強引用 軟引用 弱引用 虛引用

Java 7之基礎 - 強引用、弱引用、軟引用、虛引用

10. http

Android之Http通訊——1.初識Http協議
Android Http請求頭與響應頭的學習

11. 介面和抽象類的區別

  • 介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
  • 類可以實現很多個介面,但是隻能繼承一個抽象類
  • 類如果要實現一個介面,它必須要實現介面宣告的所有方法。但是,類可以不實現抽象類宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。
  • 抽象類可以在不提供介面方法實現的情況下實現介面。
  • Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。
  • Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。
  • 介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。

12.字串

Java中的字串常量池
Java細節:字串的拼接

13. java併發

Android

Android基礎知識

1. Android生命週期

2. Android啟動模式

3. Service

Android Service完全解析,關於服務你所需知道的一切

Service兩種啟動方式的區別

如何讓一個Service一直保持存活?

IntentService的特點
  • 它建立了一個獨立的工作執行緒來處理所有的透過onStartCommand()傳遞給服務的intents。
  • 建立了一個工作佇列,來逐個傳送intent給onHandleIntent()。
  • 不需要主動呼叫stopSelft()來結束服務。因為,在所有的intent被處理完後,系統會自動關閉服務。
  • 預設實現的onBind()返回null
  • 預設實現的onStartCommand()的目的是將intent插入到工作佇列中

4. 自定義view

Android LayoutInflater原理分析,帶你一步步深入瞭解View
Android View 四個建構函式詳解

5.DiskLruCache LruCache

Android DiskLruCache完全解析,硬碟快取的最佳方案

6.Touch事件傳遞機制

  1. Touch事件分發中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關事件。View包含dispatchTouchEvent、onTouchEvent兩個相關事件。其中ViewGroup又繼承於View。
  2. ViewGroup和View組成了一個樹狀結構,根節點為Activity內部包含的一個ViwGroup。
  3. 觸控事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸控事件中,Down和Up都只有一個,Move有若干個,可以為0個。
  4. 當Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發。ViewGroup的遍歷可以看成是遞迴的。分發的目的是為了找到真正要處理本次完整觸控事件的View,這個View會在onTouchEvent結果返回true。
  5. 當某個子View返回true時,會中止Down事件的分發,同時在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進行處理。由於子View是儲存在ViewGroup中的,多層ViewGroup的節點結構時,上級ViewGroup儲存的會是真實處理事件的View所在的ViewGroup物件:如ViewGroup0-ViewGroup1-TextView的結構中,TextView返回了true,它將被儲存在ViewGroup1中,而ViewGroup1也會返回true,被儲存在ViewGroup0中。當Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。
  6. 當ViewGroup中所有子View都不捕獲Down事件時,將觸發ViewGroup自身的onTouch事件。觸發的方式是呼叫super.dispatchTouchEvent函式,即父類View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發Acitivity的onTouchEvent方法。
  7. onInterceptTouchEvent有兩個作用:1.攔截Down事件的分發。2.中止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup捕獲Up和Move事件。
dispatchTouchEvent原始碼分析總結
  1. 觸控控制元件(View)首先執行dispatchTouchEvent方法。
    在dispatchTouchEvent方法中先執行onTouch方法,後執行onClick方法(onClick方法在onTouchEvent中執行,下面會分析)。
  2. 如果控制元件(View)的onTouch返回false或者mOnTouchListener為null(控制元件沒有設定setOnTouchListener方法)或者控制元件不是enable的情況下會調運onTouchEvent,dispatchTouchEvent返回值與onTouchEvent返回一樣。
  3. 如果控制元件不是enable的設定了onTouch方法也不會執行,只能透過重寫控制元件的onTouchEvent方法處理(上面已經處理分析了),dispatchTouchEvent返回值與onTouchEvent返回一樣。
  4. 如果控制元件(View)是enable且onTouch返回true情況下,dispatchTouchEvent直接返回true,不會呼叫onTouchEvent方法。

7.動畫

Android屬性動畫完全解析,初識屬性動畫的基本用法

8.View的繪製流程

從ViewRoot的performTraversals()方法開始依次呼叫perfromMeasure、performLayout和performDraw這三個方法。這三個方法分別完成頂級View的measure、layout和draw三大流程,其中perfromMeasure會呼叫measure,measure又會呼叫onMeasure,在onMeasure方法中則會對所有子元素進行measure,這個時候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過程,接著子元素會重複父容器的measure,如此反覆就完成了整個View樹的遍歷.

同理,performLayout和performDraw也分別完成perfromMeasure類似的流程。透過這三大流程,分別遍歷整棵View樹,就實現了Measure,Layout,Draw這一過程,View就繪製出來了。

9.Android效能最佳化

  • 佈局最佳化:儘量減少佈局檔案的層級,刪除佈局中無用的控制元件和層級。<merge> <incude> <ViewStub>提供按需載入的功能
  • 繪製最佳化:onDraw()方法中不要建立新的區域性物件,不要做耗時的任務 GPU過度繪製 HierarchyView來檢測 開發者選項 顯示開發者過度繪製選項
  • 記憶體洩露最佳化:context、handler、bitmap、單例模式、內部類、靜態變數、資源物件沒有關閉
  • 響應速度最佳化和ANR日誌分析:避免在主執行緒中做耗時操作,系統會在/data/anr目錄下建立一個檔案traces.txt
  • 避免建立過多的物件
  • 不要過多使用列舉,列舉佔用的記憶體空間要比整型大
  • 常量請使用static final 來修飾
  • 使用一些Android特有的資料結構,比如SparseArray和Pair等,他們都具有更好的效能
  • 適當使用軟引用和弱引用
  • 採用記憶體快取和磁碟快取
  • 儘量採用靜態內部類,這樣可以避免潛在的由於內部類而導致的記憶體洩露
  • Android應用開發效能最佳化完全分析

10.MVP模式

淺談 MVP in Android

11.橫豎屏切換,Android生命週期的變化

  • 不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
  • 設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次
  • 設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

11.WebView

WebView效能、體驗分析與最佳化
Android中Java和JavaScript互動

12. Android中出現65536的限制的原因以及解決辦法

Android dex 65536 的原因 以及解決辦法

13. Android Lint的工作機制原理

14. Android中的Dalvik VM ART JVM 的區別


15.Android記憶體洩露問題

避免Android中Context引起的記憶體洩露
譯文:Android中糟糕的AsyncTask
Android中Handler引起的記憶體洩露

16. RecyclerView和ListView的區別

17.compileSdkVersion, minSdkVersion 和 targetSdkVersion區別

18. RelativeLayout和LinearLayout效能分析

  • RelativeLayout會讓子View呼叫2次onMeasure,LinearLayout 在有weight時,也會呼叫子View2次onMeasure
  • RelativeLayout的子View如果高度和RelativeLayout不同,則會引發效率問題,當子View很複雜時,這個問題會更加嚴重。如果可以,儘量使用padding代替margin。
  • 在不影響層級深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout。
  • 為什麼Google給開發者預設新建了個RelativeLayout,而自己卻在DecorView中用了個LinearLayout。因為DecorView的層級深度是已知而且固定的,上面一個標題欄,下面一個內容欄。採用RelativeLayout並不會降低層級深度,所以此時在根節點上用LinearLayout是效率最高的。而之所以給開發者預設新建了個RelativeLayout是希望開發者能採用儘量少的View層級來表達佈局以實現效能最優,因為複雜的View巢狀對效能的影響會更大一些。

19. 圖片處理

Android高效載入大圖、多圖解決方案,有效避免程式OOM

20. 螢幕適配問題

21. 多程式的知識

Android API原始碼和第三方框架原始碼

1. AsyncTask

Android AsyncTask 原始碼解析

  1. 設定當前AsyncTask的狀態為RUNNING,上面的switch也可以看出,每個非同步任務在完成前只能執行一次。
  2. 執行了onPreExecute(),當前依然在UI執行緒,所以我們可以在其中做一些準備工作。
  3. 將我們傳入的引數賦值給了mWorker.mParams ,mWorker為一個Callable的子類,且在內部的call()方法中,呼叫了doInBackground(mParams),然後得到的返回值作為postResult的引數進行執行;postResult中透過sHandler傳送訊息,最終sHandler的handleMessage中完成onPostExecute的呼叫。
  4. exec.execute(mFuture),mFuture為真正的執行任務的單元,將mWorker進行封裝,然後由sDefaultExecutor交給執行緒池進行執行。

如果現在大家去面試,被問到AsyncTask的缺陷,可以分為兩個部分說,在3.0以前,最大支援128個執行緒的併發,10個任務的等待。在3.0以後,無論有多少任務,都會在其內部單執行緒執行;

2. Handler

Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係

  1. 首先Looper.prepare()在本執行緒中儲存一個Looper例項,然後該例項中儲存一個MessageQueue物件;因為Looper.prepare()在一個執行緒中只能呼叫一次,所以MessageQueue在一個執行緒中只會存在一個。
  2. Looper.loop()會讓當前執行緒進入一個無限迴圈,不端從MessageQueue的例項中讀取訊息,然後回msg.target.dispatchMessage(msg)方法。
  3. Handler的構造方法,會首先得到當前執行緒中儲存的Looper例項,進而與Looper例項中的MessageQueue想關聯。
  4. Handler的sendMessage方法,會給msg的target賦值為handler自身,然後加入MessageQueue中。
  5. 在構造Handler例項時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終呼叫的方法。

好了,總結完成,大家可能還會問,那麼在Activity中,我們並沒有顯示的呼叫Looper.prepare()和Looper.loop()方法,為啥Handler可以成功建立呢,這是因為在Activity的啟動程式碼中,已經在當前UI執行緒呼叫了Looper.prepare()和Looper.loop()方法。

3.Retrofit

Android:手把手帶你深入剖析 Retrofit 2.0 原始碼

4. Glide

Android圖片載入框架最全解析,Glide的基本用法

5.OkHttp

拆輪子系列:拆 OkHttp

6.HandlerThread

Android HandlerThread 原始碼分析

7. IntentService

Android IntentService完全解析 當Service遇到Handler

8. leakcanary

9. Volley

  1. 當一個RequestQueue被成功申請後會開啟一個CacheDispatcher和4個預設的NetworkDispatcher。
  2. CacheDispatcher快取排程器最為第一層緩衝,開始工作後阻塞的從快取序列mCacheQueue中取得請求;對於已經取消的請求,標記為跳過並結束這個請求;新的或者過期的請求,直接放入mNetworkQueue中由N個NetworkDispatcher進行處理;已獲得快取資訊(網路應答)卻沒有過期的請求,由Request的parseNetworkResponse進行解析,從而確定此應答是否成功。然後將請求和應答交由Delivery分發者進行處理,如果需要更新快取那麼該請求還會被放入mNetworkQueue中。
  3. 將請求Request add到RequestQueue後對於不需要快取的請求(需要額外設定,預設是需要快取)直接丟入mNetworkQueue交給N個NetworkDispatcher處理;對於需要快取的,新的請求加到mCacheQueue中給CacheDispatcher處理;需要快取,但是快取列表中已經存在了相同URL的請求,放在mWaitingQueue中做暫時處理,等待之前請求完畢後,再重新新增到mCacheQueue中。
  4. 網路請求排程器NetworkDispatcher作為網路請求真實發生的地方,對訊息交給BasicNetwork進行處理,同樣的,請求和結果都交由Delivery分發者進行處理。
  5. Delivery分發者實際上已經是對網路請求處理的最後一層了,在Delivery對請求處理之前,Request已經對網路應答進行過解析,此時應答成功與否已經設定;而後Delivery根據請求所獲得的應答情況做不同處理;若應答成功,則觸發deliverResponse方法,最終會觸發開發者為Request設定的Listener;若應答失敗,則觸發deliverError方法,最終會觸發開發者為Request設定的ErrorListener;處理完後,一個Request的生命週期就結束了,Delivery會呼叫Request的finish操作,將其從mRequestQueue中移除,與此同時,如果等待列表中存在相同URL的請求,則會將剩餘的層級請求全部丟入mCacheQueue交由CacheDispatcher進行處理。

資料結構與演算法

1. 演算法實現統計出Activity中的view樹的深度

2. HashMap

Java集合---HashMap原始碼剖析

3. LinkedList

Java集合---LinkedList原始碼解析

4. ArrayList

Java集合---ArrayList的實現原理

5.ConcurrentHashMap

Java併發程式設計:併發容器之ConcurrentHashMap(轉載)

6.List Map Set的區別

淺談Java中的Set、List、Map的區別

7. 快速排序

圖解快速排序

8. 二分查詢

二分查詢演算法(遞迴與非遞迴兩種方式)

9.陣列去重

其他問題

1. 工作中遇到一次最大困難時什麼 你最後是怎麼解決的 如果讓你再來一次你是否能夠解決的更好

2. 職業規劃

3. HTTP和HTTPS的區別

  • HTTP協議使用預設80埠,HTTPS協議使用443埠
  • HTTPS協議需要到CA申請證照,一般免費的證照較少,需要交費
  • HTTP資訊是明文傳輸,HTTPS使用具有安全性的SSL加密傳輸資訊

4. http1和http2的區別

  • http2可以同時發多個請求
  • http2會壓縮,體積小
  • http2伺服器會推送

3. 加密演算法有哪些?對稱加密和非對稱加密的區別?

MD5,SHA1,Base64,RSA,AES,DES

非對稱金鑰加密的使用過程:
  1. A要向B傳送資訊,A和B都要產生一對用於加密和解密的公鑰和私鑰。
  2. A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。
  3. A要給B傳送資訊時,A用B的公鑰加密資訊,因為A知道B的公鑰。
  4. A將這個訊息發給B(已經用B的公鑰加密訊息)。
  5. B收到這個訊息後,B用自己的私鑰解密A的訊息,其他所有收到這個報文的人都無法解密,因為只有B才有B的私鑰。
  6. 反過來,B向A傳送訊息也是一樣。
對稱加密和非對稱加密的區別
  1. 對稱加密加密與解密使用的是同樣的金鑰,所以速度快,但由於需要將金鑰在網路傳輸,所以安全性不高。
  2. 非對稱加密使用了一對金鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
  3. 解決的辦法是將對稱加密的金鑰使用非對稱加密的公鑰進行加密,然後傳送出去,接收方使用私鑰進行解密得到對稱加密的金鑰,然後雙方可以使用對稱加密來進行溝通。


作者:Alfred泉
連結:

來源:簡書

另一篇: 2017-2018最新Android面試題: https://blog.csdn.net/huangqili1314/article/details/72792682



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28932681/viewspace-2557334/,如需轉載,請註明出處,否則將追究法律責任。

相關文章