個(gè)人搜集的一下Android面試的題目
解析部分间坐,盡量弄成在面試中回答的模式吧,把重點(diǎn)挑出來,盡量精簡(jiǎn)回答竹宋。
最后再把詳細(xì)解析的網(wǎng)址發(fā)出來放到拓展這塊劳澄,暫時(shí)這么規(guī)劃吧
分類:
第一篇解決內(nèi)容:
java相關(guān)的部分
第二篇正在整理
Java相關(guān):
1、多線程操作蜈七、volatile解析秒拔、死鎖
2、HashMap相關(guān)(原理飒硅、怎么解決碰撞這些)
Android相關(guān):
1砂缩、LRUCache
2、組件化三娩、插件化庵芭、熱修復(fù)
3、AIDL
4雀监、ANR双吆、內(nèi)存泄漏、內(nèi)存溢出
5会前、Activity啟動(dòng)好乐、Activity的View生成和繪制(window、activity瓦宜、veiw)
6曹宴、handler、looper(拓展:ThreadLocal)之類的歉提,舉個(gè)例子:主線程中的Looper.loop()一直無限循環(huán)為什么不會(huì)造成ANR?
7区转、進(jìn)程線程通訊相關(guān)苔巨。
8、事件分發(fā)
9废离、sharedpreferences 的 commit apply區(qū)別
10侄泽、String、StringBuffer蜻韭、StringBuilder
11悼尾、四大引用使用場(chǎng)景、GC
10肖方、Retrofit闺魏、Okhttp、EventBus之類的源碼
算法:
快速排序
求兩個(gè)字符串的最長(zhǎng)公共子串
交換2個(gè)變量的值俯画,不用中間變量
網(wǎng)絡(luò)相關(guān):
tcp析桥、udp(tcp為啥一定是三次握手、四次揮手,2次行不行)
解析:
1泡仗、java題目:
1.1埋虹、多線程和volatile、死鎖
1.1.1 java中多線程的一些知識(shí)點(diǎn):
線程的start()方法和run()方法的區(qū)別:
start才是真正意義上的啟動(dòng)線程娩怎,run方法在結(jié)果上就跟把線程當(dāng)成方法來啟動(dòng)差不多搔课。在多線程情況下,我們應(yīng)該使用start截亦,這樣才能實(shí)現(xiàn)異步爬泥,run的話還是一個(gè)個(gè)順序排下來的,沒實(shí)現(xiàn)異步魁巩。(可以這么理解急灭,start就是讓線程開啟多線程模式,然后調(diào)用run正式使用線程)谷遂。
多線程操作葬馋、volatitle 、?synchronized 怎么理解:
多線程操作肾扰、基本方法就是同步代碼塊畴嘶,使用?synchronized 來修飾操作方法。
volatitle的解析:
被volatitle所修飾的變量集晚,會(huì)被同步到主內(nèi)存中窗悯,其他線程獲取這個(gè)變量的時(shí)候,如果這個(gè)變量被修改了偷拔,自然內(nèi)存地址不一樣蒋院,因此其他線程就會(huì)知道這個(gè)變量不是正確的數(shù)值,會(huì)再次從朱內(nèi)存中取新數(shù)值莲绰,這樣來保證同步欺旧。
synchronized的解析:
synchronized 能修飾在哪里:1、普通方法蛤签;2辞友、靜態(tài)方法;3震肮、代碼塊称龙;4、類(修飾類這個(gè)基本等同于靜態(tài)方法戳晌,因?yàn)樾揎楈o態(tài)方法實(shí)際上就是修飾了靜態(tài)方法所在的類)
原理是什么:
synchronized是根據(jù)monitor 來實(shí)現(xiàn)的鲫尊,可以說,它規(guī)定了被synchronized所修飾的成員沦偎,最多只有一個(gè)可以執(zhí)行马昨,否則就阻塞竞帽,當(dāng)monitor 為0,即原來持有此成員的對(duì)象退出了鸿捧,其他對(duì)象方可獲取持有權(quán)
死鎖
什么叫死鎖:
所謂死鎖是指多個(gè)線程因競(jìng)爭(zhēng)資源而造成的一種僵局(互相等待)屹篓,若無外力作用,這些進(jìn)程都將無法向前推進(jìn)匙奴。
1.2堆巧、HashMap相關(guān)(原理、怎么解決碰撞這些)
HashMap的一些基本知識(shí):
hashMap的底層結(jié)構(gòu):數(shù)組+鏈表泼菌,即將一大串拉鏈法構(gòu)成的鏈表填入數(shù)組中谍肤,一個(gè)鏈表對(duì)應(yīng)一個(gè)數(shù)組下標(biāo);鏈表才用拉鏈法哗伯,即鏈表中存在下一個(gè)鏈表荒揣;hashmap的鏈表中除了下一個(gè)鏈表,還保存有key-value焊刹,以及hash值系任。
hashmap的最大容量: 1 << 30,即2的30次方虐块,hashMap本身容量超過這個(gè)容量和負(fù)載因子的乘積俩滥,會(huì)執(zhí)行rehash,即擴(kuò)大容量(默認(rèn)翻倍)贺奠,然后重新把數(shù)據(jù)填入擴(kuò)容后的hashMap(因此非常耗性能)
hash碰撞:
hashMap的put方法是根據(jù)key值的hashcode來獲取地址的霜旧,但相同的hashcode不一定是一個(gè)對(duì)象,所以可能存在多個(gè)對(duì)象存在同一個(gè)hashcode的情況儡率,這就是hash沖突(也有叫hash碰撞)
put方法的理解:
第一步挂据,就是去找key值對(duì)應(yīng)的hashcode,并計(jì)算對(duì)應(yīng)的hash值儿普,這步被稱為“擾動(dòng)函數(shù)”崎逃,混合高位和低位的數(shù)據(jù),增加hash散列值的隨機(jī)性箕肃,減少?zèng)_突;
第二步今魔,是計(jì)算下標(biāo)勺像,也就是indexFor方法,將上一步計(jì)算得到的值和當(dāng)前容量大小-1做一個(gè)“與”操作错森,這樣就得到了一個(gè)小于當(dāng)前數(shù)組大小的值(這里hashmap的設(shè)計(jì)者有個(gè)很巧妙的做法吟宦,一般是直接除以容量大小取余,但是由于規(guī)定了hashmap的容量為2的次冪涩维,所以容量大小減一的結(jié)果就是一堆1殃姓,執(zhí)行“與”計(jì)算袁波,這樣效率就比取余高了),從而當(dāng)做數(shù)組下標(biāo)蜗侈。
第三步篷牌,是根據(jù)上一步的數(shù)組下標(biāo),從HashMapEntry(也就是底層結(jié)構(gòu)中的數(shù)組)這個(gè)數(shù)組中取得鏈表踏幻,因?yàn)橛捎跊_突的存在枷颊,所以還要遍歷一遍取出來的鏈表,將對(duì)應(yīng)的key值找出來该面;如果存在這個(gè)key值夭苗,那么將value覆蓋掉,并返回舊值隔缀。
第四步题造,如果第三步并未找到舊的值,那么就添加一個(gè)HashMapEntry猾瘸,在這個(gè)過程中界赔,先會(huì)判斷是否需要擴(kuò)容,如果需要须妻,那么先擴(kuò)容仔蝌,然后再次重新計(jì)算hash值。如果不需要荒吏,則直接添加鏈表中敛惊。
get方法的理解:
第一步,首先判斷是否key為空绰更,為空的話瞧挤,像put的2、3兩步一樣儡湾,獲取數(shù)組下標(biāo)特恬,循環(huán)遍歷數(shù)組中所有鏈表癌刽,去除key值為空的那個(gè)显拜。
第二步,如果不為空爹袁,那么還是執(zhí)行put中的2远荠、3兩步,然后判斷hash值失息、key是否都是相同的譬淳,如果是档址,取出對(duì)應(yīng)的value,如果不是邻梆,則返回空
hashMap的擴(kuò)容:
put方法中提到了擴(kuò)容這個(gè)操作守伸,默認(rèn)是執(zhí)行的是2倍大小的擴(kuò)容,所做的操作也就是生成一個(gè)新的數(shù)組确虱,然后遍歷原來的數(shù)組數(shù)據(jù)含友,取出hash值并填入新數(shù)組窘问,最后用新的數(shù)組替換原來的數(shù)組。
SparseArray:
Android官方描述中宜咒,是這么評(píng)價(jià)SparseArray的:當(dāng)使用HashMap(K, V),如果K為整數(shù)類型時(shí),使用SparseArray的效率更高惠赫。?這么說的原因主要有一下幾點(diǎn):
1、SparseArray采用的是2個(gè)數(shù)組一一對(duì)應(yīng)的結(jié)構(gòu)故黑。
2场晶、SparseArray采用二分查找法(因此倒序的時(shí)候是比hashmap慢的)
拓展(即參考學(xué)習(xí)用的文章):
1、java題目:
1.1诗轻、多線程和volatile钳宪、死鎖
Synchronized 使用:
https://blog.csdn.net/luoweifu/article/details/46613015
Synchronized 的解析:
1.2、HashMap相關(guān)(原理扳炬、怎么解決碰撞這些)
hash()方法和indexFor()方法解析: