溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

有哪些Android的面試心得

發(fā)布時(shí)間:2020-08-03 09:21:12 來源:億速云 閱讀:115 作者:Leah 欄目:web開發(fā)

今天就跟大家聊聊有關(guān)有哪些Android的面試心得,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

一、簡(jiǎn)歷

網(wǎng)上有很多對(duì)程序員簡(jiǎn)歷的一些指導(dǎo),這里就不重述,大家可以搜下網(wǎng)上其他大神的總結(jié),結(jié)合自身情況修改下。我有幾點(diǎn)建議:

1.盡量不要花哨,程序員和設(shè)計(jì)師或者產(chǎn)品運(yùn)營還不一樣,我們的簡(jiǎn)歷成功與否決定權(quán)還是在技術(shù)面試官那,而他們看重的是你的項(xiàng)目經(jīng)驗(yàn)內(nèi)容和技術(shù)等描述。

2.技能描述這塊盡量只寫你懂得而且理解深刻的,可以適當(dāng)加入一些新技術(shù)或流行框架,不過這塊需要理解,沒來得及看源碼的可以看看大神們對(duì)它的總結(jié),網(wǎng)上一大堆。

3.項(xiàng)目經(jīng)驗(yàn)這塊盡量加入關(guān)鍵詞,比如使用了什么技術(shù)、用到哪些設(shè)計(jì)模式、優(yōu)化數(shù)據(jù)對(duì)比、擴(kuò)展總結(jié)之類的。而非一味地介紹這個(gè)項(xiàng)目?jī)?nèi)容(那是產(chǎn)品經(jīng)理的描述),比如性能優(yōu)化這塊,分為UI性能優(yōu)化、內(nèi)存優(yōu)化、數(shù)據(jù)庫優(yōu)化、網(wǎng)絡(luò)優(yōu)化、耗電優(yōu)化等等??梢詮?.如何發(fā)現(xiàn)問題,2.怎么解決問題,3.解決效果對(duì)比,這幾個(gè)方面去描述。舉個(gè)簡(jiǎn)單例子——UI優(yōu)化,可以從 UI出現(xiàn)什么問題(卡頓不流暢),怎么查找問題(手機(jī)開發(fā)者權(quán)限>GPU過度繪制 發(fā)現(xiàn)層級(jí)問題,TraceView CPU使用情況分析),怎么解決問題(降低層級(jí)、自定義View繪圖出現(xiàn)問題等),解決問題后性能再次對(duì)比。

二、技能儲(chǔ)備

(一)Java

一、HashMap和Hashtable區(qū)別?

這個(gè)一定要去看源碼!看源碼!看源碼!實(shí)在看不下去的可以上網(wǎng)看別人的分析。簡(jiǎn)單總結(jié)有幾點(diǎn):

1.HashMap支持null Key和null Value;Hashtable不允許。這是因?yàn)镠ashMap對(duì)null進(jìn)行了特殊處理,將null的hashCode值定為了0,從而將其存放在哈希表的第0個(gè)bucket。

2.HashMap是非線程安全,HashMap實(shí)現(xiàn)線程安全方法為Map map = Collections.synchronziedMap(new HashMap());Hashtable是線程安全

3.HashMap默認(rèn)長(zhǎng)度是16,擴(kuò)容是原先的2倍;Hashtable默認(rèn)長(zhǎng)度是11,擴(kuò)容是原先的2n+1

4.HashMap繼承AbstractMap;Hashtable繼承了Dictionary

擴(kuò)展,HashMap 對(duì)比 ConcurrentHashMap ,HashMap 對(duì)比 SparseArray,LinkedArray對(duì)比ArrayList,ArrayList對(duì)比Vector

二、Java垃圾回收機(jī)制

需要理解JVM,內(nèi)存劃分——方法區(qū)、內(nèi)存堆、虛擬機(jī)棧(線程私有)、本地方法棧(線程私有)、程序計(jì)數(shù)器(線程私有), 理解回收算法——標(biāo)記清除算法、可達(dá)性分析算法、標(biāo)記-整理算法、復(fù)制算法、分代算法,優(yōu)缺點(diǎn)都理解下。

詳細(xì)的可以看看其他同學(xué)寫的 點(diǎn)擊打開鏈接

三、類加載機(jī)制

這個(gè)可以結(jié)合 熱修復(fù) 深入理解下。點(diǎn)擊打開鏈接

四、線程和線程池,并發(fā),鎖等一系列問題

這個(gè)可以擴(kuò)展下 如何自己實(shí)現(xiàn)一個(gè)線程池?

五、HandlerThread、IntentService理解

六、弱引用、軟引用區(qū)別

七、int、Integer有什么區(qū)別

主要考值傳遞和引用傳遞問題

八、手寫生產(chǎn)者/消費(fèi)者 模式

(二)Android

一、android啟動(dòng)模式

需要了解下Activity棧和taskAffinity

1.Standard:系統(tǒng)默認(rèn),啟動(dòng)一個(gè)就多一個(gè)Activity實(shí)例

2.SingleTop:棧頂復(fù)用,如果處于棧頂,則生命周期不走onCreate()和onStart(),會(huì)調(diào)用onNewIntent(),適合推送消息詳情頁,比如新聞推送詳情Activity;

3.SingleTask:棧內(nèi)復(fù)用,如果存在棧內(nèi),則在其上所有Activity全部出棧,使得其位于棧頂,生命周期和SingleTop一樣,app首頁基本是用這個(gè)

4.SingleInstance:這個(gè)是SingleTask加強(qiáng)本,系統(tǒng)會(huì)為要啟動(dòng)的Activity單獨(dú)開一個(gè)棧,這個(gè)棧里只有它,適用新開Activity和app能獨(dú)立開的,如系統(tǒng)鬧鐘,微信的視頻聊天界面不知道是不是,知道的同學(xué)告訴我下,在此謝過!

另外,SingleTask和SingleInstance好像會(huì)影響到onActivityResult的回調(diào),具體問題大家搜下,我就不詳說。

Intent也需要進(jìn)一步了解,Action、Data、Category各自的用法和作用,還有常用的

Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TOP

等等,具體看下源碼吧。

二、View的繪制流程

ViewRoot
-> performTraversal()
-> performMeasure()
-> performLayout()
-> perfromDraw()
-> View/ViewGroup measure()
-> View/ViewGroup onMeasure()
-> View/ViewGroup layout()
-> View/ViewGroup onLayout()
-> View/ViewGroup draw()
-> View/ViewGroup onDraw()

看下invalidate方法,有帶4個(gè)參數(shù)的,和不帶參數(shù)有什么區(qū)別;requestLayout觸發(fā)measure和layout,如何實(shí)現(xiàn)局部重新測(cè)量,避免全局重新測(cè)量問題。

三、事件分發(fā)機(jī)制

-> dispatchTouchEvent()
-> onInterceptTouchEvent()
-> onTouchEvent()
requestDisallowInterceptTouchEvent(boolean)

還有onTouchEvent()、onTouchListener、onClickListener的先后順序

四、消息分發(fā)機(jī)制

這個(gè)考得非常常見。一定要看源碼,代碼不多。帶著幾個(gè)問題去看:

1.為什么一個(gè)線程只有一個(gè)Looper、只有一個(gè)MessageQueue?

2.如何獲取當(dāng)前線程的Looper?是怎么實(shí)現(xiàn)的?(理解ThreadLocal)

3.是不是任何線程都可以實(shí)例化Handler?有沒有什么約束條件?

4.Looper.loop是一個(gè)死循環(huán),拿不到需要處理的Message就會(huì)阻塞,那在UI線程中為什么不會(huì)導(dǎo)致ANR?

5.Handler.sendMessageDelayed()怎么實(shí)現(xiàn)延遲的?結(jié)合Looper.loop()循環(huán)中,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。

五、AsyncTask源碼分析

優(yōu)劣性分析,這個(gè)網(wǎng)上一大堆,不重述。

六、如何保證Service不被殺死?如何保證進(jìn)程不被殺死?

這兩個(gè)問題我面試過程有3家公司問到。

七、Binder機(jī)制,進(jìn)程通信

Android用到的進(jìn)程通信底層基本都是Binder,AIDL、Messager、廣播、ContentProvider。不是很深入理解的,至少ADIL怎么用,Messager怎么用,可以寫寫看,另外序列化(Parcelable和Serilizable)需要做對(duì)比,這方面可以看看任玉剛大神的android藝術(shù)開發(fā)探索一書。

八、動(dòng)態(tài)權(quán)限適配問題、換膚實(shí)現(xiàn)原理

這方面看下鴻洋大神的博文吧

九、SharedPreference原理,能否跨進(jìn)程?如何實(shí)現(xiàn)?

(三)性能優(yōu)化問題

一、UI優(yōu)化

a.合理選擇RelativeLayout、LinearLayout、FrameLayout,RelativeLayout會(huì)讓子View調(diào)用2次onMeasure,而且布局相對(duì)復(fù)雜時(shí),onMeasure相對(duì)比較復(fù)雜,效率比較低,LinearLayout在weight>0時(shí)也會(huì)讓子View調(diào)用2次onMeasure。LinearLayout weight測(cè)量分配原則。

b.使用標(biāo)簽<include><merge><ViewStub>

c.減少布局層級(jí),可以通過手機(jī)開發(fā)者選項(xiàng)>GPU過渡繪制查看,一般層級(jí)控制在4層以內(nèi),超過5層時(shí)需要考慮是否重新排版布局。

d.自定義View時(shí),重寫onDraw()方法,不要在該方法中新建對(duì)象,否則容易觸發(fā)GC,導(dǎo)致性能下降

e.使用ListView時(shí)需要復(fù)用contentView,并使用Holder減少findViewById加載View。

f.去除不必要背景,getWindow().setBackgroundDrawable(null)

g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局

二、內(nèi)存優(yōu)化

主要為了避免OOM和頻繁觸發(fā)到GC導(dǎo)致性能下降

a.Bitmap.recycle(),Cursor.close,inputStream.close()

b.大量加載Bitmap時(shí),根據(jù)View大小加載Bitmap,合理選擇inSampleSize,RGB_565編碼方式;使用LruCache緩存

c.使用 靜態(tài)內(nèi)部類+WeakReference 代替內(nèi)部類,如Handler、線程、AsyncTask

d.使用線程池管理線程,避免線程的新建

e.使用單例持有Context,需要記得釋放,或者使用全局上下文

f.靜態(tài)集合對(duì)象注意釋放

g.屬性動(dòng)畫造成內(nèi)存泄露

h.使用webView,在Activity.onDestory需要移除和銷毀,webView.removeAllViews()和webView.destory()

備:使用LeakCanary檢測(cè)內(nèi)存泄露

三、響應(yīng)速度優(yōu)化

Activity如果5秒之內(nèi)無法響應(yīng)屏幕觸碰事件和鍵盤輸入事件,就會(huì)出現(xiàn)ANR,而BroadcastReceiver如果10秒之內(nèi)還未執(zhí)行操作也會(huì)出現(xiàn)ANR,Serve20秒會(huì)出現(xiàn)ANR 為了避免ANR,可以開啟子線程執(zhí)行耗時(shí)操作,但是子線程不能更新UI,因此需要Handler消息機(jī)制、AsyncTask、IntentService進(jìn)行線程通信。

備:出現(xiàn)ANR時(shí),adb pull data/anr/tarces.txt 結(jié)合log分析

四、其他性能優(yōu)化

a.常量使用static final修飾

b.使用SparseArray代替HashMap

c.使用線程池管理線程

d.ArrayList遍歷使用常規(guī)for循環(huán),LinkedList使用foreach

e.不要過度使用枚舉,枚舉占用內(nèi)存空間比整型大

f.字符串的拼接優(yōu)先考慮StringBuilder和StringBuffer

g.數(shù)據(jù)庫存儲(chǔ)是采用批量插入+事務(wù)

(四)設(shè)計(jì)模式

1.單例模式:好幾種寫法,要求會(huì)手寫,分析優(yōu)劣。一般雙重校驗(yàn)鎖中用到volatile,需要分析volatile的原理

2.觀察者模式:要求會(huì)手寫,有些面試官會(huì)問你在項(xiàng)目中用到了嗎?實(shí)在沒有到的可以講一講EventBus,它用到的就是觀察者模式

3.適配器模式:要求會(huì)手寫,有些公司會(huì)問和裝飾器模式、代理模式有什么區(qū)別?

4.建造者模式+工廠模式:要求會(huì)手寫

5.策略模式:這個(gè)問得比較少,不過有些做電商的會(huì)問。

6.MVC、MVP、MVVM:比較異同,選擇一種你拿手的著重講就行

(五)數(shù)據(jù)結(jié)構(gòu)

1.HashMap、LinkedHashMap、ConcurrentHashMap,在用法和原理上有什么差異,很多公司會(huì)考HashMap原理,通過它做一些擴(kuò)展,比如中國13億人口年齡的排序問題,年齡對(duì)應(yīng)桶的個(gè)數(shù),年齡相同和hash相同問題類似。

2.ArrayList和LinkedList對(duì)比,這個(gè)相對(duì)簡(jiǎn)單一點(diǎn)。

3.平衡二叉樹、二叉查找樹、紅黑樹,這幾個(gè)我也被考到。

4.Set原理,這個(gè)和HashMap考得有點(diǎn)類似,考hash算法相關(guān),被問到過常用hash算法。HashSet內(nèi)部用到了HashMap

(六)算法

算法主要考刷題吧,去LeetCode和??途W(wǎng)刷下。

(七)源碼理解

項(xiàng)目中多多少少會(huì)用到開源框架,很多公司都喜歡問原理和是否看過源碼,比如網(wǎng)絡(luò)框架Okhttp,這是最常用的,現(xiàn)在Retrofit+RxJava也很流行。

一、網(wǎng)絡(luò)框架庫 Okhttp

okhttp源碼一定要去看下,里面幾個(gè)關(guān)鍵的類要記住,還有連接池,攔截器都需要理解。被問到如何給某些特定域名的url增加header,如果是自己封裝的代碼,可以在封裝Request中可以解決,也可以增加攔截器,通過攔截器去做。

推薦一篇講解Okhttp不錯(cuò)的文章

二、消息通知 EventBus

1.EventBus原理:建議看下源碼,不多。內(nèi)部實(shí)現(xiàn):觀察者模式+注解+反射

2.EventBus可否跨進(jìn)程問題?代替EventBus的方法(RxBus)

三、圖片加載庫(Fresco、Glide、Picasso)

1.項(xiàng)目中選擇了哪個(gè)圖片加載庫?為什么選擇它?其他庫不好嗎?這幾個(gè)庫的區(qū)別

2.項(xiàng)目中選擇圖片庫它的原理,如Glide(LruCache結(jié)合弱引用),那么面試官會(huì)問LruCache原理,進(jìn)而問LinkedHashMap原理,這樣一層一層地問,所以建議看到不懂的追進(jìn)去看。如Fresco是用來MVC設(shè)計(jì)模式,5.0以下是用了共享內(nèi)存,那共享內(nèi)存怎么用?Fresco怎么實(shí)現(xiàn)圓角?Fresco怎么配置緩存?

四、消息推送Push

1.項(xiàng)目中消息推送是自己做的還是用了第三方?如極光。還有沒有用過其他的?這幾家有什么優(yōu)勢(shì)區(qū)別,基于什么原因選擇它的?

2.消息推送原理是什么?如何實(shí)現(xiàn)心跳連接?

五、TCP/IP、Http/Https

網(wǎng)絡(luò)這一塊如果簡(jiǎn)歷中寫道熟悉TCP/IP協(xié)議,Http/Https協(xié)議,那么肯定會(huì)被問道,我就驗(yàn)證了。一般我會(huì)回答網(wǎng)絡(luò)層關(guān)系、TCP和UDP的區(qū)別,TCP三次握手(一定要講清楚,SYN、ACK等標(biāo)記位怎樣的還有報(bào)文結(jié)構(gòu)都需要熟悉下),四次揮手。為什么要三次握手?DDoS攻擊。為什么握手三次,揮手要四次?Http報(bào)文結(jié)構(gòu),一次網(wǎng)絡(luò)請(qǐng)求的過程是怎樣的?Http和Https有什么不同?SSL/TLS是怎么進(jìn)行加密握手的?證書怎么校驗(yàn)?對(duì)稱性加密算法和非對(duì)稱加密算法有哪些?挑一個(gè)熟悉的加密算法簡(jiǎn)單介紹下?DNS解析是怎樣的?

六、熱更新、熱修復(fù)、插件化(這一塊要求高點(diǎn),一般高級(jí)工程師是需要理解的)

了解classLoader

七、新技術(shù)

RxJava、RxBus、RxAndroid,這個(gè)在面試想去的公司時(shí),可以反編譯下他們的包,看下是不是用到,如果用到了,面試過程難免會(huì)問道,如果沒有,也可以忽略,但學(xué)習(xí)心強(qiáng)的同學(xué)可以看下,比較是比較火的框架。

Retrofit,熟練okhttp的同學(xué)建議看下,聽說結(jié)合RxJava很爽。

Kotlin

三、最后

簡(jiǎn)歷首選內(nèi)推方式,速度快,效率高??!然后可以在拉鉤,boss,脈脈,大街上看看。簡(jiǎn)歷上寫道熟悉什么技術(shù)就一定要去熟悉它,不然被問到不會(huì)很尷尬!做過什么項(xiàng)目,即使項(xiàng)目體量不大,但也一定要熟悉實(shí)現(xiàn)原理!不是你負(fù)責(zé)的部分,也可以看看同事是怎么實(shí)現(xiàn)的,換你來做你會(huì)怎么做?做過什么,會(huì)什么是廣度問題,取決于項(xiàng)目?jī)?nèi)容。但做過什么,達(dá)到怎樣一個(gè)境界,這是深度問題,和個(gè)人學(xué)習(xí)能力和解決問題的態(tài)度有關(guān)了。大公司看深度,小公司看廣度。大公司面試你會(huì)的,小公司面試他們用到的你會(huì)不會(huì),也就是崗位匹配度。

選定你想去的幾家公司后,先去一些小的公司練練,學(xué)習(xí)下面試技巧,總結(jié)下,也算是熟悉下面試氛圍,平時(shí)和同事或者產(chǎn)品PK時(shí)可以講得頭頭是道,思路清晰至極,到了現(xiàn)場(chǎng)真的不一樣,怎么描述你所做的一切,這絕對(duì)是個(gè)學(xué)術(shù)性問題!

面試過程一定要有禮貌!即使你覺得面試官不尊重你,經(jīng)常打斷你的講解,或者你覺得他不如你,問的問題缺乏專業(yè)水平,你也一定要尊重他,誰叫現(xiàn)在是他選擇你,等你拿到offer后就是你選擇他了。

另外,描述問題一定要慢!不要一下子講一大堆,慢顯得你沉穩(wěn)、自信,而且你還有時(shí)間反應(yīng)思路接下來怎么講更好?,F(xiàn)在開發(fā)過多依賴ide,所以會(huì)有個(gè)弊端,當(dāng)我們?cè)诿嬖囍v解很容易不知道某個(gè)方法怎么讀,這是一個(gè)硬傷......所以一定要對(duì)常見的關(guān)鍵性的類名、方法名、關(guān)鍵字讀準(zhǔn),有些面試官不耐煩會(huì)說“你到底說的是哪個(gè)?”這時(shí)我們會(huì)容易亂了陣腳。正確的發(fā)音+沉穩(wěn)的描述+好聽的嗓音決對(duì)是一個(gè)加分項(xiàng)!

最重要的是心態(tài)!心態(tài)!心態(tài)!重要事情說三遍!面試時(shí)間很短,在短時(shí)間內(nèi)對(duì)方要摸清你的底子還是比較不現(xiàn)實(shí)的,所以,有時(shí)也是看眼緣,這還是個(gè)看臉的時(shí)代。

看完上述內(nèi)容,你們對(duì)有哪些Android的面試心得有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI