從16年畢業(yè)至今丹鸿,就職過兩家公司,大大小小項(xiàng)目做了幾個(gè)棚品,非常感謝我的兩位老大靠欢,在我的android成長路上給予我很多指導(dǎo),亦師亦友的關(guān)系铜跑。
從年前至今參加面試了很多公司门怪,也收到了幾家巨頭的offer,還有其他公司的锅纺≈揽眨總結(jié)下經(jīng)驗(yàn),也是對(duì)過去的一個(gè)回顧和總結(jié)吧囤锉。
一拣帽、簡歷
網(wǎng)上有很多對(duì)程序員簡歷的一些指導(dǎo),這里就不重述嚼锄,大家可以搜下網(wǎng)上其他大神的總結(jié)减拭,結(jié)合自身情況修改下。我有幾點(diǎn)建議:
盡量不要花哨区丑,程序員和設(shè)計(jì)師或者產(chǎn)品運(yùn)營還不一樣拧粪,我們的簡歷成功與否決定權(quán)還是在技術(shù)面試官那修陡,而他們看重的是你的項(xiàng)目經(jīng)驗(yàn)內(nèi)容和技術(shù)等描述。
技能描述這塊盡量只寫你懂得而且理解深刻的可霎,可以適當(dāng)加入一些新技術(shù)或流行框架魄鸦,不過這塊需要理解,沒來得及看源碼的可以看看大神們對(duì)它的總結(jié)癣朗,網(wǎng)上一大堆拾因。
項(xiàng)目經(jīng)驗(yàn)這塊盡量加入關(guān)鍵詞,比如使用了什么技術(shù)旷余、用到哪些設(shè)計(jì)模式绢记、優(yōu)化數(shù)據(jù)對(duì)比、擴(kuò)展總結(jié)之類的正卧。而非一味地介紹這個(gè)項(xiàng)目內(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)化等等饥追。可以從1.如何發(fā)現(xiàn)問題罐盔,2.怎么解決問題判耕,3.解決效果對(duì)比,這幾個(gè)方面去描述翘骂。舉個(gè)簡單例子——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é)有幾點(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)長度是16丹诀,擴(kuò)容是原先的2倍钝的;Hashtable默認(rèn)長度是11,擴(kuò)容是原先的2n+1
4.HashMap繼承AbstractMap铆遭;Hashtable繼承了Dictionary
hashmap1.8之前和之后的版本之間的區(qū)別硝桩,數(shù)據(jù)結(jié)構(gòu)?
擴(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)擊打開鏈接
http://www.importnew.com/16173.html
三、類加載機(jī)制
這個(gè)可以結(jié)合 熱修復(fù) 深入理解下车海。點(diǎn)擊打開鏈接
http://www.importnew.com/18548.html
四笛园、線程和線程池,并發(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)局部重新測量村视,避免全局重新測量問題。
三酒奶、事件分發(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測量分配原則。
b.使用標(biāo)簽
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檢測內(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ì)簡單一點(diǎn)。
3.平衡二叉樹海诲、二叉查找樹繁莹、紅黑樹,這幾個(gè)我也被考到特幔。
4.Set原理咨演,這個(gè)和HashMap考得有點(diǎn)類似,考hash算法相關(guān)蚯斯,被問到過常用hash算法薄风。HashSet內(nèi)部用到了HashMap
(六)算法
算法主要考刷題吧,去LeetCode和排那叮客網(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)勢區(qū)別,基于什么原因選擇它的誉帅?
2.消息推送原理是什么淀散?如何實(shí)現(xiàn)心跳連接?
五蚜锨、TCP/IP档插、Http/Https
網(wǎng)絡(luò)這一塊如果簡歷中寫道熟悉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è)熟悉的加密算法簡單介紹下?DNS解析是怎樣的?
六跳昼、熱更新般甲、熱修復(fù)、插件化(這一塊要求高點(diǎn)鹅颊,一般高級(jí)工程師是需要理解的)
了解classLoader
七敷存、新技術(shù)
RxJava、RxBus堪伍、RxAndroid锚烦,這個(gè)在面試想去的公司時(shí),可以反編譯下他們的包帝雇,看下是不是用到涮俄,如果用到了,面試過程難免會(huì)問道尸闸,如果沒有彻亲,也可以忽略,但學(xué)習(xí)心強(qiáng)的同學(xué)可以看下吮廉,比較是比較火的框架苞尝。
Retrofit,熟練okhttp的同學(xué)建議看下宦芦,聽說結(jié)合RxJava很爽野来。
Kotlin
三、最后
簡歷首選內(nèi)推方式踪旷,速度快曼氛,效率高啊令野!然后可以在拉鉤舀患,boss,脈脈气破,大街上看看聊浅。簡歷上寫道熟悉什么技術(shù)就一定要去熟悉它,不然被問到不會(huì)很尷尬现使!做過什么項(xiàng)目低匙,即使項(xiàng)目體量不大,但也一定要熟悉實(shí)現(xiàn)原理碳锈!不是你負(fù)責(zé)的部分顽冶,也可以看看同事是怎么實(shí)現(xiàn)的,換你來做你會(huì)怎么做售碳?做過什么强重,會(huì)什么是廣度問題绞呈,取決于項(xiàng)目內(nèi)容。但做過什么间景,達(dá)到怎樣一個(gè)境界佃声,這是深度問題,和個(gè)人學(xué)習(xí)能力和解決問題的態(tài)度有關(guān)了倘要。大公司看深度圾亏,小公司看廣度。大公司面試你會(huì)的封拧,小公司面試他們用到的你會(huì)不會(huì)召嘶,也就是崗位匹配度。
選定你想去的幾家公司后哮缺,先去一些小的公司練練弄跌,學(xué)習(xí)下面試技巧,總結(jié)下尝苇,也算是熟悉下面試氛圍铛只,平時(shí)和同事或者產(chǎn)品PK時(shí)可以講得頭頭是道,思路清晰至極糠溜,到了現(xiàn)場真的不一樣淳玩,怎么描述你所做的一切,這絕對(duì)是個(gè)學(xué)術(shù)性問題非竿!
面試過程一定要有禮貌蜕着!即使你覺得面試官不尊重你,經(jīng)常打斷你的講解红柱,或者你覺得他不如你承匣,問的問題缺乏專業(yè)水平,你也一定要尊重他锤悄,誰叫現(xiàn)在是他選擇你韧骗,等你拿到offer后就是你選擇他了。
另外零聚,描述問題一定要慢袍暴!不要一下子講一大堆,慢顯得你沉穩(wěn)隶症、自信政模,而且你還有時(shí)間反應(yīng)思路接下來怎么講更好。現(xiàn)在開發(fā)過多依賴ide蚂会,所以會(huì)有個(gè)弊端淋样,當(dāng)我們在面試講解很容易不知道某個(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í)代。
希望大家都能找到合適自己滿意的工作缸濒!fighting足丢!