?Android?面試總結(jié)
第一部分 Java部分
1?hashmap和hashtable的區(qū)別 詳情請參考源碼
??父類不同
??查詢方式不同
??Hashmap 不是線程安全的而hashtable是線程安全的
??Hashmap key value 允許使用null值 那是因?yàn)閔ashmap默認(rèn)把null的hash值設(shè)置成了0??而hashtable不允許key value使用null值
??Hashmap默認(rèn)長度是16?每次增長2倍 ?hashtable默認(rèn)長度是11?每次增加2n+1
Hashmap源碼解析:
數(shù)組和鏈表如何工作? -----? 當(dāng)執(zhí)行put方法的時(shí)候 把key的hashcode值通過位運(yùn)算轉(zhuǎn)變成數(shù)組下標(biāo)
2?array list和 linkedlist的區(qū)別?詳情請參考源碼
??Arraylist?是以數(shù)組的形式存儲數(shù)據(jù) ?在查詢的情況下 array list?效率比較快一點(diǎn)
??Linkedlist以單鏈表的形式存儲數(shù)據(jù) 在插入和刪除的情況下 linkedlist效率會快一點(diǎn)?
3?Java四種引用方式 ?弱引用和軟引用區(qū)別
??使用軟引用 Java?GC工作的時(shí)候 如果內(nèi)存空間夠的話 不會回收 只有內(nèi)存空間不夠的情況下 才會回收 ?而使用弱引用的話 只要GC一工作便會回收
第二部分 Android?
?1??Activity的生命周期
??oncreate 當(dāng)activity創(chuàng)建的時(shí)候執(zhí)行此方法
??onstart?當(dāng)activity開始運(yùn)行 但是用戶看不見的時(shí)候執(zhí)行此方法
??onresume 當(dāng)activity處于前臺 用戶能看見了 執(zhí)行此方法
??onpause 當(dāng)activity處于后臺執(zhí)行方法
??onstart 當(dāng)activity暫停 執(zhí)行此方法
??onrestart ?當(dāng)actvitiy 從后臺重新回到前臺執(zhí)行此方法压昼。
??Ondestroy 當(dāng)activity?銷毀執(zhí)行此方法
??Activity?的啟動方式
??Standard?默認(rèn)啟動方式 每次都會創(chuàng)建一個(gè)新的activity
??SingeTop 棧頂復(fù)用模式 ?當(dāng)activity處于棧頂?shù)臅r(shí)候 不執(zhí)行 oncreate onstart 方法 執(zhí)行 onnewIntert 方法??如果不處于棧頂 則會重新創(chuàng)建一個(gè)activity實(shí)例
??SingeTask 當(dāng)activity處于棧頂?shù)臅r(shí)候不執(zhí)行 oncreate?onstart方法 執(zhí)行 onnewIntent 當(dāng)activity?不在棧頂 他會把位于他上頭的activity都出棧 自己到棧頂
??Singeinstance 單例模式的 直接創(chuàng)建一個(gè)新的任務(wù)棧 并且把a(bǔ)ctivity實(shí)例放在任務(wù)棧中
2 Fragment?的生命周期
3 Service 生命周期
4 Android設(shè)計(jì)模式
???單例模式 觀察者模式 代理模式
5 ?JVM
6?HTTP協(xié)議網(wǎng)絡(luò)請求
?http發(fā)送請求分為七個(gè)步驟
??第一步建立連接
第二部客戶端向服務(wù)器發(fā)送http請求
第三步客戶端發(fā)送請求頭信息?最后發(fā)送一個(gè)空的請求體代表請求頭信息發(fā)送完畢 如果是post提交?則會繼續(xù)發(fā)送請求體
第四步 服務(wù)器端應(yīng)答 應(yīng)答的第一部分是版本號和http狀態(tài)碼
第五步 發(fā)送應(yīng)答頭信息 最后發(fā)送一個(gè)空白行代表發(fā)送結(jié)束
第六步 web服務(wù)器發(fā)送數(shù)據(jù)以Content-type 應(yīng)答頭信息 開始的 然后跟一個(gè)空行 再以下是響應(yīng)的數(shù)據(jù)
第七步 web服務(wù)器關(guān)閉TCP連接奏夫,一旦web服務(wù)器向客戶端發(fā)送完消息之后它就要關(guān)閉TCP請求熔任。
?三次握手
??第一次握手 ?建立連接稚配,將SYN設(shè)置為1?seq設(shè)置x?然后客戶端進(jìn)入等待狀態(tài)
??第二次握手 ?服務(wù)器端收到客戶端的SYN設(shè)置褒翰,需要對SYN值進(jìn)行確認(rèn)萝勤,設(shè)置ACK的值為 seq+1办龄,同時(shí)自己還要發(fā)送SYN值 設(shè)置為1?,seq設(shè)置成Y颈渊,此時(shí)服務(wù)器進(jìn)入等待狀態(tài)
??第三次握手 ?客戶端收到服務(wù)器的SYN+ACK報(bào)文段遂黍,然后將ACK設(shè)置成seq+1 seq?= z一并發(fā)給服務(wù)器
??為了防止已失效的連接請求報(bào)文段突然又傳送到服務(wù)端,因而產(chǎn)生錯誤 所以才需要三次握手俊嗽。
?四次揮手
?五層模型 ??
應(yīng)用層(http) ?傳輸層(tcp) ?網(wǎng)絡(luò)層(ip) ?鏈路層?物理層
?http和https的區(qū)別
Socket是應(yīng)用層與TCP/IP協(xié)議通信的一個(gè)抽象層雾家,它是一組接口,
?7多線程 線程池
?8線程安全 volatile關(guān)鍵字
???Synchronized (新塊兒奈斯特) 同步代碼塊 同步方法
???Lock?是一個(gè)接口 當(dāng)發(fā)生異常的時(shí)候不會主動釋放鎖 必須通過lock.unlock釋放
?Synchronized是Java的關(guān)鍵字 當(dāng)發(fā)生異常的時(shí)候會主動釋放鎖
?Volatile
9?HandlerThread ???IntentService
?IntentServic繼承自service绍豁。其實(shí)內(nèi)部是以handler和handlerThread實(shí)現(xiàn)的 在oncreate方法里創(chuàng)建一個(gè)HandlerTread ?
?然后在里頭創(chuàng)建了一個(gè)名為ServiceHandler的hanlder ?然后把ServiceHandler和HandlerThread對應(yīng)的子線程進(jìn)行綁定
通過onstartcommand方法 內(nèi)部調(diào)用onstart方法把消息傳遞給Intent,依次插入到工作隊(duì)列中芯咧,并逐個(gè)發(fā)送給onhandlerIntent方法
HandlerThread是Google幫我們封裝好的 可以執(zhí)行多個(gè)耗時(shí)操作 里面采用的是Handler?Looper方式實(shí)現(xiàn)的
使用HandlerThread必須先調(diào)用start方法 調(diào)用start方法之后線程會交給虛擬機(jī)調(diào)度 虛擬機(jī)自行調(diào)用run方法
10?Handler講解。
?Handler???負(fù)責(zé)處理消息?
?MessageQueue ?存放消息?先進(jìn)先出原則
?Looper ??輪詢消息隊(duì)列里有沒有消息 如果有消息就取出來?
??主線程的Looper在activityThread已經(jīng)創(chuàng)建好了 所以主線程創(chuàng)建handler的時(shí)候不需要手動創(chuàng)捷looper
??當(dāng)在activity主線程創(chuàng)建handler的時(shí)候 首先會先查找有沒有l(wèi)ooper
子線程中使用handler要創(chuàng)建Looper對象 調(diào)用Looper.prepare方法創(chuàng)建Looper?調(diào)用Looper.loop方法來輪詢消息隊(duì)列
?當(dāng)Handler發(fā)送消息的時(shí)候會調(diào)用 MessageQueue 的 enqueuemessage方法來向消息隊(duì)列里頭插入消息?當(dāng)通過looper.loop 循環(huán)消息的時(shí)候 調(diào)用MessageQueue.next 方法來獲取消息
?Looper存儲在ThreadLocal里頭 ThreadLocal是線程本地存儲區(qū)妹田,每個(gè)線程都有自己私有的線程存儲區(qū)唬党,不同線程之間不能訪問彼此的線程存儲區(qū) 簡稱TLS區(qū)域
當(dāng)handler執(zhí)行sendMessage方法時(shí) 經(jīng)過層層調(diào)用一直到MessageQueue的enqueueMessage方法往消息隊(duì)列里插入數(shù)據(jù) 然后Loope通過MessageQueue.next方法取出消息
?為什么主線程loop死線程不會導(dǎo)致ANR
???MessageQueue.next方法會獲取到第一個(gè)消息 來進(jìn)行對比 看看到?jīng)]到執(zhí)行時(shí)間如果沒到執(zhí)行時(shí)間就等待 會放到Linux層等待 釋放當(dāng)前線程
?10.1 ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程的生命周期內(nèi)起作用鬼佣,減少同一個(gè)線程內(nèi)多個(gè)函數(shù)或者組件之間一些公共變量的傳遞的復(fù)雜度驶拱。換句話說ThreadLocal是線程隔離的工具類
???一個(gè)Thraed只對應(yīng)一個(gè)Looper , 因?yàn)镸essageQueue是在Looper里頭創(chuàng)建的所以也只有一個(gè)
???因?yàn)長ooper的prepare方法里頭調(diào)用了ThreadLocal.get方法來保證唯一性 如果之前已經(jīng)創(chuàng)建過 就拋出異常
?11?當(dāng)Android中發(fā)生handler泄露怎么辦
?發(fā)生泄漏的情況一般是handler在執(zhí)行耗時(shí)任務(wù)的時(shí)候?activity已經(jīng)處于關(guān)閉狀態(tài) 這個(gè)時(shí)候 由于handler還沒有運(yùn)行完畢 還持有activity的引用 所以沒法回收activity?
?解決辦法 ?當(dāng)activity?執(zhí)行 ondestroy方法的時(shí)候 關(guān)閉handler?把handler設(shè)置成null
?第二種辦法就是 把當(dāng)前handler設(shè)置成靜態(tài)的 ?在handler里對當(dāng)前activity使用弱引用
?12??Android中使用cookie??
?13??mvc mvp mvvm
??MVP全稱是 model view presenter
???優(yōu)點(diǎn) 視圖(View) 和 model 完全分離?邏輯代碼全部放再presenter里頭 可以更高效的使用model
???缺點(diǎn) presenter與view交互過于頻繁 view發(fā)生改變 presenter也要隨之發(fā)生改變
???Mvc 有點(diǎn) 耦合度低 重用性高 ?
??在MVP框架里 model和view并不直接交互 而是使用presenter做為兩者之間的橋梁
?14 ?okhttp
?15 EnevtBus 工作原理
16?rxjava
17 view的繪制過程
???onMeause onLayout onDraw
18?Android?事件分發(fā)
??Activity PhoneWindow DecorView ViewGroup View
?先判斷父容器是否攔截事件,沒有攔截再繼續(xù)向下分發(fā)晶衷,分發(fā)的時(shí)候找觸摸點(diǎn)在哪個(gè)View 找的過程就是分發(fā)的過程蓝纲,找到dispatchTouchEvent為true的View
?沖突解決方法 ?
???1 內(nèi)部攔截 ?在子view進(jìn)行處理的就 叫內(nèi)部攔截
???2 外部攔截 ?在父容器處理的就叫外部攔截
19?進(jìn)程保活 以及進(jìn)程拉活
?進(jìn)程鄙稳遥活 1像素彼懊裕活 ?
?前臺進(jìn)程保活
?進(jìn)程拉貨
?雙進(jìn)程守護(hù)
20?進(jìn)程優(yōu)先級
??前臺進(jìn)程 可見進(jìn)程 服務(wù)進(jìn)程 后臺進(jìn)程 空進(jìn)程
21?進(jìn)程之間的通信 Aidl builder
22 內(nèi)存泄漏以及內(nèi)存優(yōu)化
???集合泄漏
???單例模式泄漏
???Handler泄漏 ??在執(zhí)行一個(gè)耗時(shí)任務(wù)的時(shí)候 當(dāng)Acitivty關(guān)閉锹漱,但是線程并沒有關(guān)閉 這個(gè)時(shí)候就會發(fā)生內(nèi)存泄漏
???非靜態(tài)內(nèi)部類泄漏 ?因?yàn)榉庆o態(tài)內(nèi)部類會持有外部類的引用
???Static 泄漏??盡量不要用靜態(tài)變量 它的生命周期伴隨整個(gè)App的生命周期
???內(nèi)存優(yōu)化 ?
?????布局優(yōu)化 ?盡可能的少使用嵌套布局
?????Bitmap的優(yōu)化
?????數(shù)據(jù)緩沖優(yōu)化
?????Handler優(yōu)化
23?liveData hook技術(shù)
24?屏幕適配
????比例縮放
25 數(shù)據(jù)持久化?
MKV 不使用IO方式 使用的是MMAP
? ? Linux可以將虛擬內(nèi)存與磁盤上的對象關(guān)聯(lián)起來 箭养。以初始化這個(gè)虛擬內(nèi)存的內(nèi)容 這個(gè)過程就叫做 MMAP。
? ? MMAP? 不經(jīng)過內(nèi)核空間哥牍。通過對磁盤文件的映射毕泌,操作內(nèi)存就相當(dāng)于操作文件。