從公眾號(hào)拿來(lái)的大廠面試題,忘記哪個(gè)公號(hào)了,前段時(shí)間面試做了一部分,時(shí)間不夠很多都只簡(jiǎn)單過(guò)了一遍。題目很全,建議都過(guò)一遍!
一、java
熟練掌握java是很關(guān)鍵的,大公司不僅僅要求你會(huì)使用幾個(gè)api,更多的是要你熟悉源碼實(shí)現(xiàn)原理,甚至要你知道有哪些不足,怎么改進(jìn),還有一些java有關(guān)的一些算法,設(shè)計(jì)模式等等。
(一)java基礎(chǔ)面試知識(shí)點(diǎn)
java中==和equals和hashCode的區(qū)別
“==”,如果是基本數(shù)據(jù)類型(int、boolean、byte、double等),則比較的是值;如果是引用類型(類、數(shù)組),則比較的是在內(nèi)存中存放的地址。
int、char、long各占多少字節(jié)數(shù)
char(2字節(jié))、int(4字節(jié))、long(8字節(jié))
int與integer的區(qū)別
int是基本數(shù)據(jù)類型,integer是包裝類;int默認(rèn)值是0,integer的默認(rèn)值是null
探探對(duì)java多態(tài)的理解
面向?qū)ο笕筇卣鳎悍庋b、繼承、多態(tài)
多態(tài):父類引用指向子類對(duì)象,在執(zhí)行期間判斷所引用對(duì)象的實(shí)際類型,然后根據(jù)實(shí)際類型執(zhí)行對(duì)應(yīng)方法
多態(tài)的三要素:繼承、重寫、父類引用指向子類對(duì)象
String、StringBuffer、StringBuilder區(qū)別
String是字符串常量,字符串的拼接是創(chuàng)建一個(gè)新對(duì)象,并將原有的值復(fù)制過(guò)來(lái),原有的值就會(huì)變成垃圾被GC回收掉,所以很浪費(fèi)性能
StringBuffer和StringBuilder是字符串變量,所以是在當(dāng)前對(duì)象上操作,StringBuilder的效率最高
StringBuilder線程不安全,StringBuffer線程安全,所以單線程下推薦用StringBuilder,多線程下用StringBuffer
什么是內(nèi)部類??jī)?nèi)部類的作用
概念:內(nèi)部類是寫在類內(nèi)部,或者方法內(nèi)的類。包含成員內(nèi)部類(常用)、局部?jī)?nèi)部類(方法內(nèi))、匿名內(nèi)部類(沒(méi)有名字)、靜態(tài)內(nèi)部類(static修飾)
作用:使用內(nèi)部類可以使業(yè)務(wù)邏輯組織在一起,方便一些有業(yè)務(wù)聯(lián)系的場(chǎng)景
抽象類和接口區(qū)別
抽象類:抽象類不能被實(shí)例化,也就是說(shuō)不能被new出來(lái);關(guān)鍵詞abstract,有抽象方法的一定是抽象類,但是抽象類不一定有抽象方法,抽象類一般多作為父類,子類繼承然后實(shí)現(xiàn)父類的抽象方法
接口:接口中的變量會(huì)隱式的被指定為public static final
例子:所有的門都有open和close功能,但是不是所有的門都有報(bào)警功能,所以應(yīng)該設(shè)計(jì)一個(gè)有open和close的抽象類,一個(gè)有報(bào)警功能的接口
抽象類的意義
為子類提供一個(gè)公共的類型,封裝子類的重復(fù)內(nèi)容,父類做統(tǒng)一的封裝,子類根據(jù)自身情況去實(shí)現(xiàn)不同的業(yè)務(wù)
抽象類與接口的應(yīng)用場(chǎng)景
抽象類更多的應(yīng)用于抽象出子類的重復(fù)內(nèi)容,接口主要應(yīng)用于擴(kuò)展
抽象類是否可以沒(méi)有方法和屬性?
可以
接口的意義
接口可以多繼承,通過(guò)豐富多彩的接口定義,可以實(shí)現(xiàn)很多擴(kuò)展性的業(yè)務(wù)
泛型中extends和super的區(qū)別
<? extends T>包括T在內(nèi)的任何T的子類,向下
<? super T>包括T在內(nèi)的任何T的父類,向上
父類的靜態(tài)方法能否被子類重寫
不能,子類中就算有和父類同名的靜態(tài)方法,也不能重寫父類中的方法;但是可以繼承父類中的靜態(tài)方法
進(jìn)程和線程的區(qū)別
線程最最小單元,一個(gè)進(jìn)程包含很多個(gè)線程,最小的進(jìn)程只有一個(gè)線程
final,finally,finalize的區(qū)別
final修飾類、方法,表示子類不能繼承、重寫;修飾變量,則該變量只能被賦值一次
finally在try-catch中,一般會(huì)被執(zhí)行;若有return,則會(huì)在return之前執(zhí)行;如果被銷毀,則不會(huì)執(zhí)行
finalize,在對(duì)象被GC回收的時(shí)候,被調(diào)用對(duì)象的finalize方法,只會(huì)調(diào)用一次,一般來(lái)說(shuō)不需要我們?nèi)?shí)現(xiàn)
序列化的方式,Serializable 和Parcelable 的區(qū)別
Serializable:java的序列化方法,需要一個(gè)uuid用于序列化和反序列化;會(huì)有大量的IO操作,效率低,但是數(shù)據(jù)持久,適合序列化到本地的數(shù)據(jù)
Parcelable:android提供的序列化方法,不需要大量IO操作,開銷小,效率高,適合內(nèi)存序列化
靜態(tài)屬性和靜態(tài)方法是否可以被繼承?是否可以被重寫?以及原因?
可以被繼承,不可以被重寫;靜態(tài)屬性和方法在編譯期就已經(jīng)和類綁定在一起,所以不能重寫
靜態(tài)內(nèi)部類的設(shè)計(jì)意圖
非靜態(tài)內(nèi)部類創(chuàng)建會(huì)持有外部類的引用,而靜態(tài)內(nèi)部類沒(méi)有
成員內(nèi)部類、靜態(tài)內(nèi)部類、局部?jī)?nèi)部類和匿名內(nèi)部類的理解,以及項(xiàng)目中的應(yīng)用
談?wù)剬?duì)kotlin的理解
提供了null安全、類型檢查、自動(dòng)轉(zhuǎn)換、字符串表達(dá)式、lambda表達(dá)式、函數(shù)擴(kuò)展
閉包和局部?jī)?nèi)部類的區(qū)別
string 轉(zhuǎn)換成 integer的方式及原理
Interge.parseInt(String srtr),Interge.parseInt(String str, int radix)
Interge.parseInt(String srtr)內(nèi)部還是執(zhí)行的Interge.parseInt(String str, int radix),radix傳的10,表示十進(jìn)制
源碼中進(jìn)行一些列的異常判斷,然后轉(zhuǎn)碼計(jì)算拼接
(二) java深入源碼級(jí)(有難度)
哪些情況下的對(duì)象會(huì)被垃圾回收機(jī)制處理掉?
常見的兩種判斷方法:引用計(jì)數(shù)法、可達(dá)性分析算法
引用計(jì)數(shù)法會(huì)引起內(nèi)存泄漏的問(wèn)題,所以Java虛擬機(jī)采用的是可達(dá)性分析法
當(dāng)對(duì)象無(wú)法被GC Roots尋找到的時(shí)候,那么GC就會(huì)認(rèn)為該對(duì)象可以被回收
講一下常見編碼方式?
utf-8編碼中的中文占幾個(gè)字節(jié);int型幾個(gè)字節(jié)?
編碼規(guī)則:如果一個(gè)字節(jié),最高位是0,則這個(gè)字節(jié)是ASCII字符;如果高位是1,則連續(xù)多少個(gè)1就表示占用多少個(gè)字節(jié)
一個(gè)數(shù)字和英文字母占1個(gè)字節(jié);一個(gè)中文一般占3個(gè)字節(jié),也有4個(gè)字節(jié)
靜態(tài)代理和動(dòng)態(tài)代理的區(qū)別,什么場(chǎng)景使用?
靜態(tài)代理在程序運(yùn)行前就已知的;動(dòng)態(tài)代理是程序編譯時(shí),運(yùn)用反射機(jī)制創(chuàng)建而成的
靜態(tài)代理一般只代理一個(gè)類,因?yàn)榇淼念惗嗔?,代碼會(huì)顯得十分臃腫;
動(dòng)態(tài)代理一般是代理一個(gè)接口下的所有實(shí)現(xiàn)類,動(dòng)態(tài)代理是實(shí)現(xiàn)InvocationHandler下的invoke方法,代理類必須要實(shí)現(xiàn)接口,通過(guò)Proxy里的newProxyInstance得到代理對(duì)象
Java的異常體系
Thorwable是父類,包含Error、Exception兩種異常,Error指程序無(wú)法處理的錯(cuò)誤,由JVM拋出,如OOM;Exception分運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常
談?wù)勀銓?duì)解析與分派的認(rèn)識(shí)。
修改對(duì)象A的equals方法的簽名,那么使用HashMap存放這個(gè)對(duì)象實(shí)例的時(shí)候,會(huì)調(diào)用哪個(gè)equals方法?
Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?
如何將一個(gè)Java對(duì)象序列化到文件里?
說(shuō)說(shuō)你對(duì)Java反射的理解
說(shuō)說(shuō)你對(duì)Java注解的理解
注解也叫元數(shù)據(jù),一種代碼級(jí)別的說(shuō)明,可以申明在類、方法、變量等前面,用來(lái)對(duì)這些元素進(jìn)行說(shuō)明、注釋
注解不會(huì)直接影響被注解的代碼,注解會(huì)被編譯進(jìn)class文件中,而且會(huì)在運(yùn)行時(shí)被程序提取出來(lái)用于業(yè)務(wù)邏輯
說(shuō)說(shuō)你對(duì)依賴注入的理解
說(shuō)一下泛型原理,并舉例說(shuō)明
Java中String的了解
類被final修飾,即無(wú)法被繼承;subString、contact、replace均創(chuàng)建了一個(gè)新的String變量做操作
引入字符串常量池的概念,即初始化的時(shí)候會(huì)去常量池中查找并返回該對(duì)象的引用,若找不到再創(chuàng)建一個(gè)新的對(duì)象
String str = “abc” 和 String str = new String("abc") 的區(qū)別:字面量形式的對(duì)象初始化都會(huì)加入字符串常量池,當(dāng)內(nèi)容一致時(shí),多個(gè)引用會(huì)指向同一個(gè)對(duì)象;使用new操作創(chuàng)建的String對(duì)象,一定會(huì)在堆中創(chuàng)建對(duì)象,若涉及到字面量的創(chuàng)建,則會(huì)在字符串常量池和堆中創(chuàng)建兩個(gè)對(duì)
String線程安全,因?yàn)槠洳豢勺?;StringBuffer線程安全,因?yàn)槠渲屑尤肓舜罅康膕ynchronized關(guān)鍵字
通常情況下執(zhí)行效率:Stringbuilder>StringBuffer>String(視情況而定)
String為什么要設(shè)計(jì)成不可變的?
安全:不可變具有天生的線程安全;String常用作HashMap的key,如果可變會(huì)有安全問(wèn)題,比如key相同
高效:通過(guò)字符創(chuàng)常量池,可以節(jié)省很多空間;每個(gè)String對(duì)應(yīng)一個(gè)HashCode,再次使用不用重復(fù)計(jì)算
擴(kuò)展:可以通過(guò)反射的方式修改String的value,所以嚴(yán)格意義上來(lái)說(shuō)也不是不可變
Object類的equal和hashCode方法重寫,為什么?
因?yàn)镠ashMap在put內(nèi)容的時(shí)候,會(huì)先根據(jù)key的hashcode計(jì)算出位置,然后找到對(duì)應(yīng)位置上的鍵值,進(jìn)行key的比較,如果相同則覆蓋
如果不重寫hashcode方法,就無(wú)法定位到同一個(gè)位置,集合還是會(huì)插入元素,這樣集合中就出現(xiàn)了相同的元素,那么重寫equals就沒(méi)意義了
(三) 數(shù)據(jù)結(jié)構(gòu)
常用數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介
數(shù)組、鏈表、棧、隊(duì)列、樹、二叉樹、圖
并發(fā)集合了解哪些?
分為阻塞式集合(被阻塞方法)和非阻塞式集合(會(huì)返回null或拋出異常)兩種
列舉java的集合以及集合之間的繼承關(guān)系
集合類以及集合框架

集合類型分為三種,set(集)、list(列表)、map(映射)
collection是集合接口,定義了對(duì)集合操作的通用方法
collections是工具類,定義了很多靜態(tài)方法
容器類介紹以及之間的區(qū)別(容器類估計(jì)很多人沒(méi)聽這個(gè)詞,Java容器主要可以劃分為4個(gè)部分:List列表、Set集合、Map映射、工具類(Iterator迭代器、Enumeration枚舉類、Arrays和Collections),具體的可以看看這篇博文 Java容器類)
List,Set,Map的區(qū)別
list:有序、允許元素重復(fù)、ArrayList查詢快、linkedList插入刪除快
set:無(wú)需、不允許元素重復(fù)、TreeSet通過(guò)實(shí)現(xiàn)comparator實(shí)現(xiàn)了一個(gè)排序順序
map:鍵值對(duì)、無(wú)需、允許重復(fù)的值,不允許重復(fù)的鍵,TreeMap實(shí)現(xiàn)comparator實(shí)現(xiàn)一個(gè)排序順序
List和Map的實(shí)現(xiàn)方式以及存儲(chǔ)方式
ArrayList:數(shù)組,每次擴(kuò)容大概是原有的1.5倍
linkedlist:雙向鏈表
hashmap:哈希表的map接口,底層使用數(shù)組實(shí)現(xiàn),數(shù)組中的每一項(xiàng)是個(gè)單向鏈表,當(dāng)鏈表長(zhǎng)度大于一定閾值時(shí),鏈表轉(zhuǎn)換為紅黑樹,這樣減少鏈表查詢時(shí)間
HashMap的實(shí)現(xiàn)原理
hashmap采用了數(shù)組和鏈表的數(shù)據(jù)結(jié)構(gòu),在查找和修改方面繼承了數(shù)組的線性查找和鏈表的尋址修改
HashMap數(shù)據(jù)結(jié)構(gòu)?
使用鏈表和數(shù)組,在達(dá)到一定閾值時(shí),轉(zhuǎn)換為紅黑樹,低于6再轉(zhuǎn)換會(huì)鏈表
HashMap源碼理解
在put(key,value)的時(shí)候,先調(diào)用key的hashCode方法獲得哈希值,找到在map中的位置,如果該位置為空,則直接放入該value;如果該位置有值,則替換掉原有值;如果桶滿了(容量默認(rèn)為16*加載因子0.75),就需要resize(擴(kuò)容兩倍后重排);如果鏈表超過(guò)閾值,就把鏈表轉(zhuǎn)為紅黑樹,如果鏈表長(zhǎng)度低于6,就把紅黑樹轉(zhuǎn)為鏈表
HashMap如何put數(shù)據(jù)(從HashMap源碼角度講解)?
HashMap怎么手寫實(shí)現(xiàn)?
ConcurrentHashMap的實(shí)現(xiàn)原理
ArrayMap和HashMap的對(duì)比
arraymap內(nèi)部使用兩個(gè)數(shù)組來(lái)實(shí)現(xiàn),一個(gè)用來(lái)保存key的hash值,一個(gè)用來(lái)保存value值
和sparseArray一樣也會(huì)對(duì)key使用二分法進(jìn)行從小到大的排序,在添加、刪除、查找數(shù)據(jù)的時(shí)候根據(jù)二分法找到對(duì)應(yīng)的index值,然后對(duì)index進(jìn)行添加、刪除、查找
在數(shù)據(jù)量大的時(shí)候,效率會(huì)降低
HashTable實(shí)現(xiàn)原理
TreeMap具體實(shí)現(xiàn)
HashMap和HashTable的區(qū)別
HashMap與HashSet的區(qū)別
HashSet與HashMap怎么判斷集合元素重復(fù)?
集合Set實(shí)現(xiàn)Hash怎么防止碰撞
ArrayList和LinkedList的區(qū)別,以及應(yīng)用場(chǎng)景
ArrayList是基于數(shù)組實(shí)現(xiàn)的;LinkedList是基于雙向鏈表實(shí)現(xiàn)的,同時(shí)還實(shí)現(xiàn)了Queue接口,功能更強(qiáng)大一些
ArrayList是基于數(shù)組實(shí)現(xiàn)的,所以在隨機(jī)訪問(wèn)上,時(shí)間復(fù)雜度為O(1),插入數(shù)據(jù)需要做數(shù)據(jù)搬移
LinkedList是基于雙向鏈表實(shí)現(xiàn)的,所以在插入或刪除數(shù)據(jù)的時(shí)候,時(shí)間復(fù)雜度為O(1)
所以ArrayList更適合做查詢操作比較多的場(chǎng)景,LinkedList更適合做插入刪除操作較多,查詢較少的場(chǎng)景;當(dāng)然在某些情況下,ArrayList的插入刪除操作也不見得比LinkedList差,比如在數(shù)據(jù)末尾的情況
數(shù)組和鏈表的區(qū)別
數(shù)組:有序、查找效率高、擴(kuò)容是在大小滿時(shí),復(fù)制數(shù)據(jù)到更大的數(shù)組中,效率低
鏈表:無(wú)序、插入、刪除效率高,根據(jù)節(jié)點(diǎn)尋找地址的方法找到下一個(gè)數(shù)據(jù)
二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷的具體實(shí)現(xiàn)
堆的結(jié)構(gòu)
堆和樹的區(qū)別
堆和棧在內(nèi)存中的區(qū)別是什么(解答提示:可以從數(shù)據(jù)結(jié)構(gòu)方面以及實(shí)際實(shí)現(xiàn)方面兩個(gè)方面去回答)?
什么是深拷貝和淺拷貝
淺拷貝:基本數(shù)據(jù)類型值傳遞,引用數(shù)據(jù)類型引用傳遞
深拷貝:基本數(shù)據(jù)類型值傳遞,引用數(shù)據(jù)類型,創(chuàng)建一個(gè)新的對(duì)象,并復(fù)制其內(nèi)容
實(shí)現(xiàn):淺拷貝(實(shí)現(xiàn)cloneable接口的clone方法)、深拷貝(序列化serialization或再clone一次)
手寫鏈表逆序代碼
講一下對(duì)樹,B+樹的理解
講一下對(duì)圖的理解
判斷單鏈表成環(huán)與否?
鏈表翻轉(zhuǎn)(即:翻轉(zhuǎn)一個(gè)單項(xiàng)鏈表)
合并多個(gè)單有序鏈表(假設(shè)都是遞增的)
(四) 線程、多線程和線程池
開啟線程的三種方式?
繼承Thread類,并重寫run方法,創(chuàng)建這個(gè)類對(duì)象,然后start方法開啟線程
實(shí)現(xiàn)runnable接口,重寫run方法,創(chuàng)建Thread,然后將這個(gè)Runable對(duì)象傳入Thread,start開啟線程
實(shí)現(xiàn)Callable接口,重寫call方法,新建一個(gè)FutureTask類對(duì)象,將FutrueTask傳入到Thread中,start開啟線程
線程和進(jìn)程的區(qū)別?
進(jìn)程包括線程
為什么要有線程,而不是僅僅用進(jìn)程?
線程效率高,代價(jià)小
run()和start()方法區(qū)別
run方法是由java虛擬機(jī)直接調(diào)用的,如果我們沒(méi)有start,直接使用run,那么將會(huì)在執(zhí)行run方法所在的線程中運(yùn)行,只有開啟了線程(start)之后,才會(huì)在開啟的線程中運(yùn)行
如何控制某個(gè)方法允許并發(fā)訪問(wèn)線程的個(gè)數(shù)?
在Java中wait和sleep方法的不同;
wait會(huì)使線程進(jìn)入等待狀態(tài),需要notify去喚醒;sleep會(huì)在一定時(shí)間后自動(dòng)喚醒
談?wù)剋ait/notify關(guān)鍵字的理解
wait、notify、notifyAll不屬于Thread類,是屬于Object基礎(chǔ)類,所以每個(gè)對(duì)象都有這些功能
wait使線程進(jìn)入等待狀態(tài),必須要獲得這個(gè)鎖對(duì)象的控制權(quán),一般是放在synchronized代碼中
notify只會(huì)通知等待隊(duì)列的第一個(gè)線程,notifyAll會(huì)通知全部
什么導(dǎo)致線程阻塞?
睡眠sleep、等待wait、線程禮讓yield、線程自閉join
線程如何關(guān)閉?
利用取消標(biāo)志位取消線程、中斷線程
講一下java中的同步的方法
synchronized修飾方法(如果所修飾方法為靜態(tài)方法,則在調(diào)用該方法時(shí),會(huì)鎖住整個(gè)類)
synchronized修飾代碼塊,同步是一個(gè)高開銷操作,如果沒(méi)必要同步整個(gè)方法,可以同步代碼塊
數(shù)據(jù)一致性如何保證?
線程同步,關(guān)鍵字volatile修飾成員變量
如何保證線程安全?
同步鎖
如何實(shí)現(xiàn)線程同步?
兩個(gè)進(jìn)程同時(shí)要求寫或者讀,能不能實(shí)現(xiàn)?如何防止進(jìn)程的同步?
線程間操作List
Java中對(duì)象的生命周期
Synchronized用法
synchronize的原理
談?wù)剬?duì)Synchronized關(guān)鍵字,類鎖,方法鎖,重入鎖的理解
static synchronized 方法的多線程訪問(wèn)和作用
同一個(gè)類里面兩個(gè)synchronized方法,兩個(gè)線程同時(shí)訪問(wèn)的問(wèn)題
volatile的原理
談?wù)剉olatile關(guān)鍵字的用法
談?wù)剉olatile關(guān)鍵字的作用
談?wù)凬IO的理解
NIO(new IO):面向緩沖、非阻塞IO、選擇器;okhttp中使用了nio
IO:面向流、阻塞IO
synchronized 和volatile 關(guān)鍵字的區(qū)別
synchronized與Lock的區(qū)別
ReentrantLock 、synchronized和volatile比較
ReentrantLock的內(nèi)部實(shí)現(xiàn)
lock原理
死鎖的四個(gè)必要條件?
怎么避免死鎖?
對(duì)象鎖和類鎖是否會(huì)互相影響?
什么是線程池,如何使用?
Java的并發(fā)、多線程、線程模型
談?wù)剬?duì)多線程的理解
多線程有什么要注意的問(wèn)題?
談?wù)勀銓?duì)并發(fā)編程的理解并舉例說(shuō)明
談?wù)勀銓?duì)多線程同步機(jī)制的理解?
如何保證多線程讀寫文件的安全?
多線程斷點(diǎn)續(xù)傳原理
斷點(diǎn)續(xù)傳的實(shí)現(xiàn)
(五)并發(fā)編程有關(guān)知識(shí)點(diǎn)(這個(gè)是一般Android開發(fā)用的少的,所以建議多去看看):
平時(shí)Android開發(fā)中對(duì)并發(fā)編程可以做得比較少,Thread這個(gè)類經(jīng)常會(huì)用到,但是我們想提升自己的話,一定不能停留在表面,,我們也應(yīng)該去了解一下java的關(guān)于線程相關(guān)的源碼級(jí)別的東西。
二、Android
Android面試題包括Android基礎(chǔ),還有一些源碼級(jí)別的、原理這些等。所以想去大公司面試,一定要多看看源碼和實(shí)現(xiàn)方式,常用框架可以試試自己能不能手寫實(shí)現(xiàn)一下,鍛煉一下自己。
(一)Android基礎(chǔ)知識(shí)點(diǎn)
四大組件是什么
activity、service、broadcast、contentProvider
四大組件的生命周期和簡(jiǎn)單用法
onCreate、onStart、onResume、onPause、onStop、onDestroy、onReStart
Activity之間的通信方式
intent、全局常量、接口、觀察者
Activity各種情況下的生命周期
橫豎屏切換的時(shí)候,Activity 各種情況下的生命周期
configChange,不設(shè)置,則會(huì)重走生命周期;設(shè)置orientation,則橫豎屏切換只會(huì)走一次;設(shè)置orientation|keyboardHidden,則橫豎屏切換不會(huì)重新調(diào)用生命周期
Activity與Fragment之間生命周期比較
Activity上有Dialog的時(shí)候按Home鍵時(shí)的生命周期
dialog是在activity之上的一個(gè)組件,出現(xiàn)時(shí)activity并不會(huì)進(jìn)入后臺(tái),在點(diǎn)擊home鍵后會(huì)執(zhí)行onStop、onDestroy方法
兩個(gè)Activity 之間跳轉(zhuǎn)時(shí)必然會(huì)執(zhí)行的是哪幾個(gè)方法?
onResume/onPause,A/B,如果B透明,A不會(huì)調(diào)用onStop
前臺(tái)切換到后臺(tái),然后再回到前臺(tái),Activity生命周期回調(diào)方法。彈出Dialog,生命值周期回調(diào)方法。
Activity的四種啟動(dòng)模式對(duì)比
Activity狀態(tài)保存于恢復(fù)
fragment各種情況下的生命周期
Fragment狀態(tài)保存startActivityForResult是哪個(gè)類的方法,在什么情況下使用?
如何實(shí)現(xiàn)Fragment的滑動(dòng)?
fragment之間傳遞數(shù)據(jù)的方式?
Activity 怎么和Service 綁定?
怎么在Activity 中啟動(dòng)自己對(duì)應(yīng)的Service?
startService、bindService
service和activity怎么進(jìn)行數(shù)據(jù)交互?
Service的開啟方式
請(qǐng)描述一下Service 的生命周期
談?wù)勀銓?duì)ContentProvider的理解
說(shuō)說(shuō)ContentProvider、ContentResolver、ContentObserver 之間的關(guān)系
請(qǐng)描述一下廣播BroadcastReceiver的理解
廣播的分類
廣播使用的方式和場(chǎng)景
在manifest 和代碼中如何注冊(cè)和使用BroadcastReceiver?
本地廣播和全局廣播有什么差別?
BroadcastReceiver,LocalBroadcastReceiver 區(qū)別
AlertDialog,popupWindow,Activity區(qū)別
Application 和 Activity 的 Context 對(duì)象的區(qū)別
Android屬性動(dòng)畫特性
如何導(dǎo)入外部數(shù)據(jù)庫(kù)?
LinearLayout、RelativeLayout、FrameLayout的特性及對(duì)比,并介紹使用場(chǎng)景。
談?wù)剬?duì)接口與回調(diào)的理解
回調(diào)的原理
寫一個(gè)回調(diào)demo
介紹下SurfView
RecycleView的使用
序列化的作用,以及Android兩種序列化的區(qū)別
差值器
估值器
Android中數(shù)據(jù)存儲(chǔ)方式
(二)Android源碼相關(guān)分析
- Android動(dòng)畫框架實(shí)現(xiàn)原理
- Android各個(gè)版本API的區(qū)別
- Requestlayout,onlayout,onDraw,DrawChild區(qū)別與聯(lián)系
- invalidate和postInvalidate的區(qū)別及使用
- Activity-Window-View三者的差別
- 談?wù)剬?duì)Volley的理解
- 如何優(yōu)化自定義View
- 低版本SDK如何實(shí)現(xiàn)高版本api?
- 描述一次網(wǎng)絡(luò)請(qǐng)求的流程
- HttpUrlConnection 和 okhttp關(guān)系
- Bitmap對(duì)象的理解
- looper架構(gòu)
- ActivityThread,AMS,WMS的工作原理
- 自定義View如何考慮機(jī)型適配
- 自定義View的事件
- AstncTask+HttpClient 與 AsyncHttpClient有什么區(qū)別?
- LaunchMode應(yīng)用場(chǎng)景
- AsyncTask 如何使用?
- SpareArray原理
- 請(qǐng)介紹下ContentProvider 是如何實(shí)現(xiàn)數(shù)據(jù)共享的?
- AndroidService與Activity之間通信的幾種方式
- IntentService原理及作用是什么?
- 說(shuō)說(shuō)Activity、Intent、Service 是什么關(guān)系
- ApplicationContext和ActivityContext的區(qū)別
- SP是進(jìn)程同步的嗎?有什么方法做到同步?
- 談?wù)劧嗑€程在Android中的使用
- 進(jìn)程和 Application 的生命周期
- 封裝View的時(shí)候怎么知道view的大小
- RecycleView原理
- AndroidManifest的作用與理解
(三)常見的一些原理性問(wèn)題
- Handler機(jī)制和底層實(shí)現(xiàn)
- Handler、Thread和HandlerThread的差別
- handler發(fā)消息給子線程,looper怎么啟動(dòng)?
- 關(guān)于Handler,在任何地方new Handler 都是什么線程下?
- ThreadLocal原理,實(shí)現(xiàn)及如何保證Local屬性?
- 請(qǐng)解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關(guān)系
- 請(qǐng)描述一下View事件傳遞分發(fā)機(jī)制
- Touch事件傳遞流程
- 事件分發(fā)中的onTouch 和onTouchEvent 有什么區(qū)別,又該如何使用?
- View和ViewGroup分別有哪些事件分發(fā)相關(guān)的回調(diào)方法
- View刷新機(jī)制
- View繪制流程
- 自定義控件原理
- 自定義View如何提供獲取View屬性的接口?
- Android代碼中實(shí)現(xiàn)WAP方式聯(lián)網(wǎng)
- AsyncTask機(jī)制
- AsyncTask原理及不足
- 如何取消AsyncTask?
- 為什么不能在子線程更新UI?
- ANR產(chǎn)生的原因是什么?
- ANR定位和修正
- oom是什么?
- 什么情況導(dǎo)致oom?
- 有什么解決方法可以避免OOM?
- Oom 是否可以try catch?為什么?
- 內(nèi)存泄漏是什么?
- 什么情況導(dǎo)致內(nèi)存泄漏?
- 如何防止線程的內(nèi)存泄漏?
- 內(nèi)存泄露場(chǎng)的解決方法
- 內(nèi)存泄漏和內(nèi)存溢出區(qū)別?
- LruCache默認(rèn)緩存大小
- ContentProvider的權(quán)限管理(解答:讀寫分離,權(quán)限控制-精確到表級(jí),URL控制)
- 如何通過(guò)廣播攔截和abort一條短信?
- 廣播是否可以請(qǐng)求網(wǎng)絡(luò)?
- 廣播引起anr的時(shí)間限制是多少?
- 計(jì)算一個(gè)view的嵌套層級(jí)
- Activity棧
- Android線程有沒(méi)有上限?
- 線程池有沒(méi)有上限?
- ListView重用的是什么?
- Android為什么引入Parcelable?
- 有沒(méi)有嘗試簡(jiǎn)化Parcelable的使用?
(四)開發(fā)中常見的一些問(wèn)題
- ListView 中圖片錯(cuò)位的問(wèn)題是如何產(chǎn)生的?
- 混合開發(fā)有了解嗎?
- 知道哪些混合開發(fā)的方式?說(shuō)出它們的優(yōu)缺點(diǎn)和各自使用場(chǎng)景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的了解一些前- 端js等還是很有好處的);
- 屏幕適配的處理技巧都有哪些?
- 服務(wù)器只提供數(shù)據(jù)接收接口,在多線程或多進(jìn)程條件下,如何保證數(shù)據(jù)的有序到達(dá)?
- 動(dòng)態(tài)布局的理解
- 怎么去除重復(fù)代碼?
- 畫出 Android 的大體架構(gòu)圖
- Recycleview和ListView的區(qū)別
- ListView圖片加載錯(cuò)亂的原理和解決方案
- 動(dòng)態(tài)權(quán)限適配方案,權(quán)限組的概念
- Android系統(tǒng)為什么會(huì)設(shè)計(jì)ContentProvider?
- 下拉狀態(tài)欄是不是影響activity的生命周期
- 如果在onStop的時(shí)候做了網(wǎng)絡(luò)請(qǐng)求,onResume的時(shí)候怎么恢復(fù)?
- Bitmap 使用時(shí)候注意什么?
- Bitmap的recycler()
- Android中開啟攝像頭的主要步驟
- ViewPager使用細(xì)節(jié),如何設(shè)置成每次只初始化當(dāng)前的Fragment,其他的不初始化?
- 點(diǎn)擊事件被攔截,但是想傳到下面的View,如何操作?
- 微信主頁(yè)面的實(shí)現(xiàn)方式
- 微信上消息小紅點(diǎn)的原理
- CAS介紹(這是阿里巴巴的面試題,我不是很了解,可以參考博客: CAS簡(jiǎn)介)
三、高級(jí)開發(fā)技術(shù)面試題
這里講的是大公司需要用到的一些高端Android技術(shù),這里專門整理了一個(gè)文檔,希望大家都可以看看。這些題目有點(diǎn)技術(shù)含量,需要好點(diǎn)時(shí)間去研究一下的。
(一)圖片
- 圖片庫(kù)對(duì)比
- 圖片庫(kù)的源碼分析
- 圖片框架緩存實(shí)現(xiàn)
- LRUCache原理
- 圖片加載原理
- 自己去實(shí)現(xiàn)圖片庫(kù),怎么做?
- Glide源碼解析
- Glide使用什么緩存?
- Glide內(nèi)存緩存如何控制大???
(二)網(wǎng)絡(luò)和安全機(jī)制
- 網(wǎng)絡(luò)框架對(duì)比和源碼分析
- 自己去設(shè)計(jì)網(wǎng)絡(luò)請(qǐng)求框架,怎么做?
- okhttp源碼
- 網(wǎng)絡(luò)請(qǐng)求緩存處理,okhttp如何處理網(wǎng)絡(luò)緩存的
- 從網(wǎng)絡(luò)加載一個(gè)10M的圖片,說(shuō)下注意事項(xiàng)
- TCP的3次握手和四次揮手
- TCP與UDP的區(qū)別
- TCP與UDP的應(yīng)用
- HTTP協(xié)議
- HTTP1.0與2.0的區(qū)別
- HTTP報(bào)文結(jié)構(gòu)
- HTTP與HTTPS的區(qū)別以及如何實(shí)現(xiàn)安全性
- 如何驗(yàn)證證書的合法性?
- https中哪里用了對(duì)稱加密,哪里用了非對(duì)稱加密,對(duì)加密算法(如RSA)等是否有了解?
- client如何確定自己發(fā)送的消息被server收到?
- 談?wù)勀銓?duì)WebSocket的理解
- WebSocket與socket的區(qū)別
- 談?wù)勀銓?duì)安卓簽名的理解。
- 請(qǐng)解釋安卓為啥要加簽名機(jī)制?
- 視頻加密傳輸
- App 是如何沙箱化,為什么要這么做?
- 權(quán)限管理系統(tǒng)(底層的權(quán)限是如何進(jìn)行 grant 的)?
(三)數(shù)據(jù)庫(kù)
- sqlite升級(jí),增加字段的語(yǔ)句
- 數(shù)據(jù)庫(kù)框架對(duì)比和源碼分析
- 數(shù)據(jù)庫(kù)的優(yōu)化
- 數(shù)據(jù)庫(kù)數(shù)據(jù)遷移問(wèn)題
(四)算法
- 排序算法有哪些?
- 最快的排序算法是哪個(gè)?
- 手寫一個(gè)冒泡排序
- 手寫快速排序代碼
- 快速排序的過(guò)程、時(shí)間復(fù)雜度、空間復(fù)雜度
- 手寫堆排序
- 堆排序過(guò)程、時(shí)間復(fù)雜度及空間復(fù)雜度
- 寫出你所知道的排序算法及時(shí)空復(fù)雜度,穩(wěn)定性
- 二叉樹給出根節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn),找出從根節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑
- 給阿里2萬(wàn)多名員工按年齡排序應(yīng)該選擇哪個(gè)算法?
- GC算法(各種算法的優(yōu)缺點(diǎn)以及應(yīng)用場(chǎng)景)
- 蟻群算法與蒙特卡洛算法
- 子串包含問(wèn)題(KMP 算法)寫代碼實(shí)現(xiàn)
- 一個(gè)無(wú)序,不重復(fù)數(shù)組,輸出N個(gè)元素,使得N個(gè)元素的和相加為M,給出時(shí)間復(fù)雜度、空間復(fù)雜度。手寫算法
- 萬(wàn)億級(jí)別的兩個(gè)URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應(yīng)用層面對(duì)尋址的優(yōu)化)
- 百度POI中如何試下查找最近的商家功能(提示:坐標(biāo)鏡像+R樹)。 兩個(gè)不重復(fù)的數(shù)組集合中,求共同的元素。
- 兩個(gè)不重復(fù)的數(shù)組集合中,這兩個(gè)集合都是海量數(shù)據(jù),內(nèi)存中放不下,怎么求共同的元素?
- 一個(gè)文件中有100萬(wàn)個(gè)整數(shù),由空格分開,在程序中判斷用戶輸入的整數(shù)是否在此文件中。說(shuō)出最優(yōu)的方法
- 一張Bitmap所占內(nèi)存以及內(nèi)存占用的計(jì)算
- 2000萬(wàn)個(gè)整數(shù),找出第五十大的數(shù)字?
- 燒一根不均勻的繩,從頭燒到尾總共需要1個(gè)小時(shí)?,F(xiàn)在有若干條材質(zhì)相同的繩子,問(wèn)如何用燒繩的方法來(lái)計(jì)時(shí)一個(gè)小時(shí)十五分鐘呢?
- 求1000以內(nèi)的水仙花數(shù)以及40億以內(nèi)的水仙花數(shù)
- 5枚硬幣,2正3反如何劃分為兩堆然后通過(guò)翻轉(zhuǎn)讓兩堆中正面向上的硬8幣和反面向上的硬幣個(gè)數(shù)相同
- 時(shí)針走一圈,時(shí)針?lè)轴樦睾蠋状?/li>
- N*N的方格紙,里面有多少個(gè)正方形
- x個(gè)蘋果,一天只能吃一個(gè)、兩個(gè)、或者三個(gè),問(wèn)多少天可以吃完?
(五)插件化、模塊化、組件化、熱修復(fù)、增量更新、Gradle
- 對(duì)熱修復(fù)和插件化的理解
- 插件化原理分析
- 模塊化實(shí)現(xiàn)(好處,原因)
- 熱修復(fù),插件化
- 項(xiàng)目組件化的理解
- 描述清點(diǎn)擊 Android Studio 的 build 按鈕后發(fā)生了什么
(六)架構(gòu)設(shè)計(jì)和設(shè)計(jì)模式
- 談?wù)勀銓?duì)Android設(shè)計(jì)模式的理解
- MVC MVP MVVM原理和區(qū)別
- 你所知道的設(shè)計(jì)模式有哪些?
- 項(xiàng)目中常用的設(shè)計(jì)模式
- 手寫生產(chǎn)者/消費(fèi)者模式
- 寫出觀察者模式的代碼
- 適配器模式,裝飾者模式,外觀模式的異同?
- 用到的一些開源框架,介紹一個(gè)看過(guò)源碼的,內(nèi)部實(shí)現(xiàn)過(guò)程。
- 談?wù)剬?duì)RxJava的理解
- RxJava的功能與原理實(shí)現(xiàn)
- RxJava的作用,與平時(shí)使用的異步操作來(lái)比的優(yōu)缺點(diǎn)
- 說(shuō)說(shuō)EventBus作用,實(shí)現(xiàn)方式,代替EventBus的方式
- 從0設(shè)計(jì)一款A(yù)pp整體架構(gòu),如何去做?
- 說(shuō)一款你認(rèn)為當(dāng)前比較火的應(yīng)用并設(shè)計(jì)(比如:直播APP,P2P金融,小視頻等)
- 談?wù)剬?duì)java狀態(tài)機(jī)理解
- Fragment如果在Adapter中使用應(yīng)該如何解耦?
- Binder機(jī)制及底層實(shí)現(xiàn)
- 對(duì)于應(yīng)用更新這塊是如何做的?(解答:灰度,強(qiáng)制更新,分區(qū)域更新)?
- 實(shí)現(xiàn)一個(gè)Json解析器(可以通過(guò)正則提高速度) 統(tǒng)計(jì)啟動(dòng)時(shí)長(zhǎng),標(biāo)準(zhǔn)
(七)性能優(yōu)化
- 如何對(duì)Android 應(yīng)用進(jìn)行性能分析以及優(yōu)化?
- ddms 和 traceView
- 性能優(yōu)化如何分析systrace?
- 用IDE如何分析內(nèi)存泄漏?
- Java多線程引發(fā)的性能問(wèn)題,怎么解決?
- 啟動(dòng)頁(yè)白屏及黑屏解決?
- 啟動(dòng)太慢怎么解決?
- 怎么保證應(yīng)用啟動(dòng)不卡頓?
- App啟動(dòng)崩潰異常捕捉
- 自定義View注意事項(xiàng)
- 現(xiàn)在下載速度很慢,試從網(wǎng)絡(luò)協(xié)議的角度分析原因,并優(yōu)化(提示:網(wǎng)絡(luò)的5層都可以涉及)。
- Https請(qǐng)求慢的解決辦法(提示:DNS,攜帶數(shù)據(jù),直接訪問(wèn)IP)
- 如何保持應(yīng)用的穩(wěn)定性
- RecyclerView和ListView的性能對(duì)比
- ListView的優(yōu)化
- RecycleView優(yōu)化
- View渲染
- Bitmap如何處理大圖,如一張30M的大圖,如何預(yù)防OOM
- java中的四種引用的區(qū)別以及使用場(chǎng)景
- 強(qiáng)引用置為null,會(huì)不會(huì)被回收?
(八)NDK、jni、Binder、AIDL、進(jìn)程通信有關(guān)
- 請(qǐng)介紹一下NDK
- 什么是NDK庫(kù)?
- jni用過(guò)嗎?
- 如何在jni中注冊(cè)native函數(shù),有幾種注冊(cè)方式?
- Java如何調(diào)用c、c++語(yǔ)言?
- jni如何調(diào)用java層代碼?
- 進(jìn)程間通信的方式?
- Binder機(jī)制
- 簡(jiǎn)述IPC?
- 什么是AIDL?
- AIDL解決了什么問(wèn)題?
- AIDL如何使用?
- Android 上的 Inter-Process-Communication 跨進(jìn)程通信時(shí)如何工作的?
- 多進(jìn)程場(chǎng)景遇見過(guò)么?
- Android進(jìn)程分類?
- 進(jìn)程和 Application 的生命周期?
- 進(jìn)程調(diào)度
- 談?wù)剬?duì)進(jìn)程共享和線程安全的認(rèn)識(shí)
- 談?wù)剬?duì)多進(jìn)程開發(fā)的理解以及多進(jìn)程應(yīng)用場(chǎng)景
- 什么是協(xié)程?
(九)framework層、ROM定制、Ubuntu、Linux之類的問(wèn)題
- java虛擬機(jī)的特性
- 談?wù)剬?duì)jvm的理解
- JVM內(nèi)存區(qū)域,開線程影響哪塊內(nèi)存
- 對(duì)Dalvik、ART虛擬機(jī)有什么了解?
- Art和Dalvik對(duì)比
- 虛擬機(jī)原理,如何自己設(shè)計(jì)一個(gè)虛擬機(jī)(內(nèi)存管理,類加載,雙親委派)
- 談?wù)勀銓?duì)雙親委派模型理解
- JVM內(nèi)存模型,內(nèi)存區(qū)域
- 類加載機(jī)制
- 談?wù)剬?duì)ClassLoader(類加載器)的理解
- 談?wù)剬?duì)動(dòng)態(tài)加載(OSGI)的理解
- 內(nèi)存對(duì)象的循環(huán)引用及避免
- 內(nèi)存回收機(jī)制、GC回收策略、GC原理時(shí)機(jī)以及GC對(duì)象
- 垃圾回收機(jī)制與調(diào)用System.gc()區(qū)別
- Ubuntu編譯安卓系統(tǒng)
- 系統(tǒng)啟動(dòng)流程是什么?(提示:Zygote進(jìn)程 –> SystemServer進(jìn)程 –> 各種系統(tǒng)服務(wù) –> 應(yīng)用進(jìn)程)
- 大體說(shuō)清一個(gè)應(yīng)用程序安裝到手機(jī)上時(shí)發(fā)生了什么
- 簡(jiǎn)述Activity啟動(dòng)全部過(guò)程
- App啟動(dòng)流程,從點(diǎn)擊桌面開始
- 邏輯地址與物理地址,為什么使用邏輯地址?
- Android為每個(gè)應(yīng)用程序分配的內(nèi)存大小是多少?
- Android中進(jìn)程內(nèi)存的分配,能不能自己分配定額內(nèi)存?
- 進(jìn)程保活的方式
- 如何保證一個(gè)后臺(tái)服務(wù)不被殺死?(相同問(wèn)題:如何保證service在后臺(tái)不被kill?)比較省電的方式是什么?
- App中喚醒其他進(jìn)程的實(shí)現(xiàn)方式
四、跨平臺(tái)Hybrid 開發(fā)
- flutter
- Html5項(xiàng)目實(shí)戰(zhàn)
- HTML&CSS&JavaScript 實(shí)戰(zhàn)
- WordPress搭建網(wǎng)站項(xiàng)目實(shí)戰(zhàn)
- 前端Vue架構(gòu)
- 前端樣式開發(fā)
- Weex內(nèi)置能力
- Weex原生應(yīng)用
- Weex擴(kuò)展框架
- WeexUI架構(gòu)
- 介紹你做過(guò)的哪些項(xiàng)目
- 都使用過(guò)哪些框架、平臺(tái)?
- 都使用過(guò)哪些自定義控件?
- 研究比較深入的領(lǐng)域有哪些?
- 對(duì)業(yè)內(nèi)信息的關(guān)注渠道有哪些?
- 最近都讀哪些書?
- 有沒(méi)有什么開源項(xiàng)目?
- 自己最擅長(zhǎng)的技術(shù)點(diǎn),最感興趣的技術(shù)領(lǐng)域和技術(shù)點(diǎn)
- 項(xiàng)目中用了哪些開源庫(kù),如何避免因?yàn)橐腴_源庫(kù)而導(dǎo)致的安全性和穩(wěn)定性問(wèn)題
- 實(shí)習(xí)過(guò)程中做了什么,有什么產(chǎn)出?