Android史上最全面試題
本文轉自:
我把面試的問題分為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記憶體最佳化
- 釋放連線
- 最佳化邏輯,釋放不必要的物件 儘量使用區域性變數
- 減少迴圈邏輯裡的物件的建立
- 基本型別代替物件型別
- 使用stringBuffer和stringBuilder替代多次String物件
- 單執行緒儘量使用hashmap和ArrayList
- 提前分配stringBuffer,陣列,array,vector等容量
- 合適的場所使用單例
- 儘量不要隨意使用靜態變數
- 處理記憶體洩露
4.執行緒池
5. 程式和執行緒的關係
6. Thread和Runnable的區別
7. 死鎖
java 死鎖及解決
【Java併發程式設計】之九:死鎖(含程式碼)
8. 單例
9. 強引用 軟引用 弱引用 虛引用
10. http
Android之Http通訊——1.初識Http協議
Android Http請求頭與響應頭的學習
11. 介面和抽象類的區別
- 介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
- 類可以實現很多個介面,但是隻能繼承一個抽象類
- 類如果要實現一個介面,它必須要實現介面宣告的所有方法。但是,類可以不實現抽象類宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。
- 抽象類可以在不提供介面方法實現的情況下實現介面。
- Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。
- Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。
- 介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。
12.字串
13. java併發
-
volatile的原理
Java併發程式設計:volatile關鍵字解析 -
synchronized的原理
Java併發程式設計:Synchronized及其實現原理 -
java.util.concurrent包詳解
Java - concurrent包詳解 - lock的實現原理
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事件傳遞機制
- Touch事件分發中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關事件。View包含dispatchTouchEvent、onTouchEvent兩個相關事件。其中ViewGroup又繼承於View。
- ViewGroup和View組成了一個樹狀結構,根節點為Activity內部包含的一個ViwGroup。
- 觸控事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸控事件中,Down和Up都只有一個,Move有若干個,可以為0個。
- 當Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發。ViewGroup的遍歷可以看成是遞迴的。分發的目的是為了找到真正要處理本次完整觸控事件的View,這個View會在onTouchEvent結果返回true。
- 當某個子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。
- 當ViewGroup中所有子View都不捕獲Down事件時,將觸發ViewGroup自身的onTouch事件。觸發的方式是呼叫super.dispatchTouchEvent函式,即父類View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發Acitivity的onTouchEvent方法。
- onInterceptTouchEvent有兩個作用:1.攔截Down事件的分發。2.中止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup捕獲Up和Move事件。
dispatchTouchEvent原始碼分析總結
-
觸控控制元件(View)首先執行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先執行onTouch方法,後執行onClick方法(onClick方法在onTouchEvent中執行,下面會分析)。 - 如果控制元件(View)的onTouch返回false或者mOnTouchListener為null(控制元件沒有設定setOnTouchListener方法)或者控制元件不是enable的情況下會調運onTouchEvent,dispatchTouchEvent返回值與onTouchEvent返回一樣。
- 如果控制元件不是enable的設定了onTouch方法也不會執行,只能透過重寫控制元件的onTouchEvent方法處理(上面已經處理分析了),dispatchTouchEvent返回值與onTouchEvent返回一樣。
- 如果控制元件(View)是enable且onTouch返回true情況下,dispatchTouchEvent直接返回true,不會呼叫onTouchEvent方法。
7.動畫
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模式
11.橫豎屏切換,Android生命週期的變化
- 不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
- 設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次
- 設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法
11.WebView
WebView效能、體驗分析與最佳化
Android中Java和JavaScript互動
12. Android中出現65536的限制的原因以及解決辦法
13. Android Lint的工作機制原理
14. Android中的Dalvik VM ART JVM 的區別
15.Android記憶體洩露問題
避免Android中Context引起的記憶體洩露
譯文:Android中糟糕的AsyncTask
Android中Handler引起的記憶體洩露
16. RecyclerView和ListView的區別
- RecyclerView的ViewHolder規範化
- RecyclerView可以實現線性佈局效果,網格佈局效果,瀑布流佈局效果
-
ListView具有setEmptyView() addHeaderView() addFooterView()
Android 優雅的為RecyclerView新增HeaderView和FooterView - RecyclerView支援區域性重新整理
- listview實現區域性重新整理
- RecyclerView輕鬆實現item動畫效果
-
RecyclerView沒有setOnItemClickListener() setOnItemLongClickListener() 而是實現了RecyclerView.OnItemTouchListener()
android開發遊記:RecyclerView無法新增onItemClickListener最佳的高效解決方案 - RecyclerView自定義分割線
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
- 設定當前AsyncTask的狀態為RUNNING,上面的switch也可以看出,每個非同步任務在完成前只能執行一次。
- 執行了onPreExecute(),當前依然在UI執行緒,所以我們可以在其中做一些準備工作。
- 將我們傳入的引數賦值給了mWorker.mParams ,mWorker為一個Callable的子類,且在內部的call()方法中,呼叫了doInBackground(mParams),然後得到的返回值作為postResult的引數進行執行;postResult中透過sHandler傳送訊息,最終sHandler的handleMessage中完成onPostExecute的呼叫。
- exec.execute(mFuture),mFuture為真正的執行任務的單元,將mWorker進行封裝,然後由sDefaultExecutor交給執行緒池進行執行。
如果現在大家去面試,被問到AsyncTask的缺陷,可以分為兩個部分說,在3.0以前,最大支援128個執行緒的併發,10個任務的等待。在3.0以後,無論有多少任務,都會在其內部單執行緒執行;
2. Handler
Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係
- 首先Looper.prepare()在本執行緒中儲存一個Looper例項,然後該例項中儲存一個MessageQueue物件;因為Looper.prepare()在一個執行緒中只能呼叫一次,所以MessageQueue在一個執行緒中只會存在一個。
- Looper.loop()會讓當前執行緒進入一個無限迴圈,不端從MessageQueue的例項中讀取訊息,然後回msg.target.dispatchMessage(msg)方法。
- Handler的構造方法,會首先得到當前執行緒中儲存的Looper例項,進而與Looper例項中的MessageQueue想關聯。
- Handler的sendMessage方法,會給msg的target賦值為handler自身,然後加入MessageQueue中。
- 在構造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
5.OkHttp
6.HandlerThread
7. IntentService
Android IntentService完全解析 當Service遇到Handler
8. leakcanary
9. Volley
- 當一個RequestQueue被成功申請後會開啟一個CacheDispatcher和4個預設的NetworkDispatcher。
- CacheDispatcher快取排程器最為第一層緩衝,開始工作後阻塞的從快取序列mCacheQueue中取得請求;對於已經取消的請求,標記為跳過並結束這個請求;新的或者過期的請求,直接放入mNetworkQueue中由N個NetworkDispatcher進行處理;已獲得快取資訊(網路應答)卻沒有過期的請求,由Request的parseNetworkResponse進行解析,從而確定此應答是否成功。然後將請求和應答交由Delivery分發者進行處理,如果需要更新快取那麼該請求還會被放入mNetworkQueue中。
- 將請求Request add到RequestQueue後對於不需要快取的請求(需要額外設定,預設是需要快取)直接丟入mNetworkQueue交給N個NetworkDispatcher處理;對於需要快取的,新的請求加到mCacheQueue中給CacheDispatcher處理;需要快取,但是快取列表中已經存在了相同URL的請求,放在mWaitingQueue中做暫時處理,等待之前請求完畢後,再重新新增到mCacheQueue中。
- 網路請求排程器NetworkDispatcher作為網路請求真實發生的地方,對訊息交給BasicNetwork進行處理,同樣的,請求和結果都交由Delivery分發者進行處理。
- Delivery分發者實際上已經是對網路請求處理的最後一層了,在Delivery對請求處理之前,Request已經對網路應答進行過解析,此時應答成功與否已經設定;而後Delivery根據請求所獲得的應答情況做不同處理;若應答成功,則觸發deliverResponse方法,最終會觸發開發者為Request設定的Listener;若應答失敗,則觸發deliverError方法,最終會觸發開發者為Request設定的ErrorListener;處理完後,一個Request的生命週期就結束了,Delivery會呼叫Request的finish操作,將其從mRequestQueue中移除,與此同時,如果等待列表中存在相同URL的請求,則會將剩餘的層級請求全部丟入mCacheQueue交由CacheDispatcher進行處理。
資料結構與演算法
1. 演算法實現統計出Activity中的view樹的深度
2. HashMap
3. LinkedList
4. ArrayList
5.ConcurrentHashMap
Java併發程式設計:併發容器之ConcurrentHashMap(轉載)
6.List Map Set的區別
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
非對稱金鑰加密的使用過程:
- A要向B傳送資訊,A和B都要產生一對用於加密和解密的公鑰和私鑰。
- A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。
- A要給B傳送資訊時,A用B的公鑰加密資訊,因為A知道B的公鑰。
- A將這個訊息發給B(已經用B的公鑰加密訊息)。
- B收到這個訊息後,B用自己的私鑰解密A的訊息,其他所有收到這個報文的人都無法解密,因為只有B才有B的私鑰。
- 反過來,B向A傳送訊息也是一樣。
對稱加密和非對稱加密的區別
- 對稱加密加密與解密使用的是同樣的金鑰,所以速度快,但由於需要將金鑰在網路傳輸,所以安全性不高。
- 非對稱加密使用了一對金鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
- 解決的辦法是將對稱加密的金鑰使用非對稱加密的公鑰進行加密,然後傳送出去,接收方使用私鑰進行解密得到對稱加密的金鑰,然後雙方可以使用對稱加密來進行溝通。
作者:Alfred泉
連結:
來源:簡書
另一篇: 2017-2018最新Android面試題: https://blog.csdn.net/huangqili1314/article/details/72792682
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28932681/viewspace-2557334/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 史上最全面試題彙總,沒有之一,不接受反駁面試題
- Android除錯工具-ADB史上最強介紹Android除錯
- 史上最詳細的一線大廠Mysql面試題詳解MySql面試題
- 花了近十年的時間,整理出史上最全面Java面試題Java面試題
- 史上最簡單的 《三角形判定》 面試題答案面試題
- 新書上市 | 史上最系統全面的預處理教程來了!新書
- Hibernate最全面試題面試題
- Android Rxjava :最簡單&全面背壓講解 (Flowable)AndroidRxJava
- 一道“史上最難”java面試題引發的執行緒安全思考Java面試題執行緒
- Kotlin系列教程——史上最全面、最詳細的學習教程,持續更新中....Kotlin
- 史上最“卷”雙11
- 2019 CSS經典面試題(史上最全)CSS面試題
- 史上最強Dubbo面試26題和答案:核心元件+服務治理+架構設計等面試元件架構
- Android事件分發機制:基礎篇:最全面、最易懂Android事件
- Android超實用最全面試大綱(一)Android面試
- 史上最全最熱門的Android 開發和安全系列必備工具Android
- 史上最輕量!阿里新型單元測試 Mock 工具開源阿里Mock
- 史上最全!押題率90%的 Android 中高階工程師面試複習大綱及真題答案整理(中篇)Android工程師面試
- Java最全面試題之Spring篇Java面試題Spring
- 史上最全面的React-react基礎React
- 一文全面瞭解Android單元測試Android
- 史上最詳細的經典面試題 從輸入URL到看到頁面發生了什麼?面試題
- 很全面的vue面試題總結Vue面試題
- 史上最嚴管控,Android P非SDK介面管控特性解讀及適配Android
- 史上最全面的Spring Boot Cache使用與整合Spring Boot
- Android 面試題集合(2018)Android面試題
- Android面試題(轉載)Android面試題
- Android 面試題整理(2018)Android面試題
- 史上最全的大廠Mysql面試題在這裡!MySql面試題
- 史上最全 Java 多執行緒面試題及答案Java執行緒面試題
- 史上最全Java多執行緒面試題,附答案Java執行緒面試題
- 史上最清晰易懂的babel配置解析Babel
- 史上最通俗分散式鎖解讀分散式
- 史上最強Tableau Server 安裝教程Server
- Android 面試題,百度,小米,阿里面試題Android面試題阿里
- Android面試送分題:Android面試真題解析火爆全網,建議收藏Android面試
- 再來一打Web安全面試題Web面試題
- 史上最全的中高階JAVA工程師-面試題彙總Java工程師面試題