從16年畢業(yè)至今,就職過兩家公司建椰,大大小小項目做了幾個雕欺,非常感謝我的兩位老大,在我的android成長路上給予我很多指導棉姐,亦師亦友的關系屠列。
從年前至今參加面試了很多公司,也收到了幾家巨頭的offer伞矩,還有其他公司的笛洛。總結下經(jīng)驗乃坤,也是對過去的一個回顧和總結吧苛让。
一、簡歷
網(wǎng)上有很多對程序員簡歷的一些指導湿诊,這里就不重述狱杰,大家可以搜下網(wǎng)上其他大神的總結,結合自身情況修改下厅须。我有幾點建議:
1.盡量不要花哨仿畸,程序員和設計師或者產(chǎn)品運營還不一樣,我們的簡歷成功與否決定權還是在技術面試官那朗和,而他們看重的是你的項目經(jīng)驗內(nèi)容和技術等描述错沽。
2.技能描述這塊盡量只寫你懂得而且理解深刻的,可以適當加入一些新技術或流行框架眶拉,不過這塊需要理解千埃,沒來得及看源碼的可以看看大神們對它的總結,網(wǎng)上一大堆忆植。
3.項目經(jīng)驗這塊盡量加入關鍵詞镰禾,比如使用了什么技術皿曲、用到哪些設計模式唱逢、優(yōu)化數(shù)據(jù)對比吴侦、擴展總結之類的。而非一味地介紹這個項目內(nèi)容(那是產(chǎn)品經(jīng)理的描述)坞古,比如性能優(yōu)化這塊备韧,分為UI性能優(yōu)化、內(nèi)存優(yōu)化痪枫、數(shù)據(jù)庫優(yōu)化织堂、網(wǎng)絡優(yōu)化、耗電優(yōu)化等等奶陈∫籽簦可以從1.如何發(fā)現(xiàn)問題,2.怎么解決問題吃粒,3.解決效果對比潦俺,這幾個方面去描述。舉個簡單例子——UI優(yōu)化徐勃,可以從 UI出現(xiàn)什么問題(卡頓不流暢)事示,怎么查找問題(手機開發(fā)者權限>GPU過度繪制 發(fā)現(xiàn)層級問題,TraceView CPU使用情況分析)僻肖,怎么解決問題(降低層級肖爵、自定義View繪圖出現(xiàn)問題等),解決問題后性能再次對比臀脏。
二劝堪、技能儲備
(一)Java
一、HashMap和Hashtable區(qū)別揉稚?
這個一定要去看源碼秒啦!看源碼!看源碼窃植!實在看不下去的可以上網(wǎng)看別人的分析帝蒿。簡單總結有幾點:
1.HashMap支持null Key和null Value;Hashtable不允許巷怜。這是因為HashMap對null進行了特殊處理葛超,將null的hashCode值定為了0,從而將其存放在哈希表的第0個bucket延塑。
2.HashMap是非線程安全绣张,HashMap實現(xiàn)線程安全方法為Map map = Collections.synchronziedMap(new HashMap());Hashtable是線程安全
3.HashMap默認長度是16关带,擴容是原先的2倍侥涵;Hashtable默認長度是11沼撕,擴容是原先的2n+1
4.HashMap繼承AbstractMap;Hashtable繼承了Dictionary?
擴展芜飘,HashMap 對比 ConcurrentHashMap 务豺,HashMap 對比 SparseArray,LinkedArray對比ArrayList嗦明,ArrayList對比Vector
二笼沥、Java垃圾回收機制
需要理解JVM,內(nèi)存劃分——方法區(qū)娶牌、內(nèi)存堆奔浅、虛擬機棧(線程私有)、本地方法棧(線程私有)诗良、程序計數(shù)器(線程私有), 理解回收算法——標記清除算法汹桦、可達性分析算法、標記-整理算法鉴裹、復制算法舞骆、分代算法,優(yōu)缺點都理解下壹罚。
詳細的可以看看其他同學寫的點擊打開鏈接
三葛作、類加載機制
這個可以結合 熱修復 深入理解下。點擊打開鏈接
四猖凛、線程和線程池赂蠢,并發(fā),鎖等一系列問題
這個可以擴展下 如何自己實現(xiàn)一個線程池辨泳?
五虱岂、HandlerThread、IntentService理解
六菠红、弱引用第岖、軟引用區(qū)別
七、int试溯、Integer有什么區(qū)別
主要考值傳遞和引用傳遞問題
八蔑滓、手寫生產(chǎn)者/消費者 模式
(二)Android
一、android啟動模式
需要了解下Activity棧和taskAffinity
1.Standard:系統(tǒng)默認遇绞,啟動一個就多一個Activity實例
2.SingleTop:棧頂復用键袱,如果處于棧頂,則生命周期不走onCreate()和onStart()摹闽,會調用onNewIntent()蹄咖,適合推送消息詳情頁,比如新聞推送詳情Activity;
3.SingleTask:棧內(nèi)復用付鹿,如果存在棧內(nèi)澜汤,則在其上所有Activity全部出棧蚜迅,使得其位于棧頂,生命周期和SingleTop一樣俊抵,app首頁基本是用這個
4.SingleInstance:這個是SingleTask加強本谁不,系統(tǒng)會為要啟動的Activity單獨開一個棧,這個棧里只有它务蝠,適用新開Activity和app能獨立開的拍谐,如系統(tǒng)鬧鐘,微信的視頻聊天界面不知道是不是馏段,知道的同學告訴我下,在此謝過践瓷!
另外院喜,SingleTask和SingleInstance好像會影響到onActivityResult的回調,具體問題大家搜下晕翠,我就不詳說喷舀。
Intent也需要進一步了解,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個參數(shù)的浇辜,和不帶參數(shù)有什么區(qū)別;requestLayout觸發(fā)measure和layout唾戚,如何實現(xiàn)局部重新測量柳洋,避免全局重新測量問題。
三叹坦、事件分發(fā)機制
->dispatchTouchEvent()->onInterceptTouchEvent()->onTouchEvent()requestDisallowInterceptTouchEvent(boolean)
還有onTouchEvent()熊镣、onTouchListener、onClickListener的先后順序
四募书、消息分發(fā)機制
這個考得非常常見绪囱。一定要看源碼,代碼不多锐膜。帶著幾個問題去看:
1.為什么一個線程只有一個Looper毕箍、只有一個MessageQueue?
2.如何獲取當前線程的Looper道盏?是怎么實現(xiàn)的而柑?(理解ThreadLocal)
3.是不是任何線程都可以實例化Handler文捶?有沒有什么約束條件淮逻?
4.Looper.loop是一個死循環(huán)产喉,拿不到需要處理的Message就會阻塞舀患,那在UI線程中為什么不會導致ANR健提?
5.Handler.sendMessageDelayed()怎么實現(xiàn)延遲的孽水?結合Looper.loop()循環(huán)中蹋砚,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析腾么。
五拘鞋、AsyncTask源碼分析
優(yōu)劣性分析妙同,這個網(wǎng)上一大堆射富,不重述。
六粥帚、如何保證Service不被殺死胰耗?如何保證進程不被殺死?
這兩個問題我面試過程有3家公司問到芒涡。
七柴灯、Binder機制,進程通信
Android用到的進程通信底層基本都是Binder费尽,AIDL赠群、Messager、廣播旱幼、ContentProvider查描。不是很深入理解的,至少ADIL怎么用速警,Messager怎么用叹誉,可以寫寫看,另外序列化(Parcelable和Serilizable)需要做對比闷旧,這方面可以看看任玉剛大神的android藝術開發(fā)探索一書长豁。
八、動態(tài)權限適配問題忙灼、換膚實現(xiàn)原理
這方面看下鴻洋大神的博文吧
九匠襟、SharedPreference原理,能否跨進程该园?如何實現(xiàn)酸舍?
(三)性能優(yōu)化問題
一、UI優(yōu)化
a.合理選擇RelativeLayout里初、LinearLayout啃勉、FrameLayout,RelativeLayout會讓子View調用2次onMeasure,而且布局相對復雜時双妨,onMeasure相對比較復雜淮阐,效率比較低叮阅,LinearLayout在weight>0時也會讓子View調用2次onMeasure。LinearLayout weight測量分配原則泣特。
b.使用標簽
c.減少布局層級浩姥,可以通過手機開發(fā)者選項>GPU過渡繪制查看,一般層級控制在4層以內(nèi)状您,超過5層時需要考慮是否重新排版布局勒叠。
d.自定義View時,重寫onDraw()方法膏孟,不要在該方法中新建對象眯分,否則容易觸發(fā)GC,導致性能下降
e.使用ListView時需要復用contentView骆莹,并使用Holder減少findViewById加載View颗搂。
f.去除不必要背景,getWindow().setBackgroundDrawable(null)
g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局
二幕垦、內(nèi)存優(yōu)化
主要為了避免OOM和頻繁觸發(fā)到GC導致性能下降
a.Bitmap.recycle(),Cursor.close,inputStream.close()
b.大量加載Bitmap時,根據(jù)View大小加載Bitmap傅联,合理選擇inSampleSize先改,RGB_565編碼方式;使用LruCache緩存
c.使用 靜態(tài)內(nèi)部類+WeakReference 代替內(nèi)部類蒸走,如Handler仇奶、線程、AsyncTask
d.使用線程池管理線程比驻,避免線程的新建
e.使用單例持有Context该溯,需要記得釋放,或者使用全局上下文
f.靜態(tài)集合對象注意釋放
g.屬性動畫造成內(nèi)存泄露
h.使用webView别惦,在Activity.onDestory需要移除和銷毀狈茉,webView.removeAllViews()和webView.destory()?
備:使用LeakCanary檢測內(nèi)存泄露
三、響應速度優(yōu)化
Activity如果5秒之內(nèi)無法響應屏幕觸碰事件和鍵盤輸入事件掸掸,就會出現(xiàn)ANR氯庆,而BroadcastReceiver如果10秒之內(nèi)還未執(zhí)行操作也會出現(xiàn)ANR,Serve20秒會出現(xiàn)ANR 為了避免ANR扰付,可以開啟子線程執(zhí)行耗時操作堤撵,但是子線程不能更新UI,因此需要Handler消息機制羽莺、AsyncTask实昨、IntentService進行線程通信。
備:出現(xiàn)ANR時盐固,adb pull data/anr/tarces.txt 結合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ù)庫存儲是采用批量插入+事務
(四)設計模式
1.單例模式:好幾種寫法锐墙,要求會手寫礁哄,分析優(yōu)劣。一般雙重校驗鎖中用到volatile溪北,需要分析volatile的原理
2.觀察者模式:要求會手寫桐绒,有些面試官會問你在項目中用到了嗎?實在沒有到的可以講一講EventBus之拨,它用到的就是觀察者模式
3.適配器模式:要求會手寫茉继,有些公司會問和裝飾器模式、代理模式有什么區(qū)別蚀乔?
4.建造者模式+工廠模式:要求會手寫
5.策略模式:這個問得比較少烁竭,不過有些做電商的會問。
6.MVC吉挣、MVP派撕、MVVM:比較異同,選擇一種你拿手的著重講就行
(五)數(shù)據(jù)結構
1.HashMap睬魂、LinkedHashMap终吼、ConcurrentHashMap,在用法和原理上有什么差異氯哮,很多公司會考HashMap原理际跪,通過它做一些擴展,比如中國13億人口年齡的排序問題喉钢,年齡對應桶的個數(shù)姆打,年齡相同和hash相同問題類似。
2.ArrayList和LinkedList對比肠虽,這個相對簡單一點幔戏。
3.平衡二叉樹、二叉查找樹舔痕、紅黑樹评抚,這幾個我也被考到。
4.Set原理伯复,這個和HashMap考得有點類似慨代,考hash算法相關,被問到過常用hash算法啸如。HashSet內(nèi)部用到了HashMap
(六)算法
算法主要考刷題吧侍匙,去LeetCode和牛客網(wǎng)刷下。
(七)源碼理解
項目中多多少少會用到開源框架想暗,很多公司都喜歡問原理和是否看過源碼妇汗,比如網(wǎng)絡框架Okhttp,這是最常用的说莫,現(xiàn)在Retrofit+RxJava也很流行杨箭。
一、網(wǎng)絡框架庫 Okhttp
okhttp源碼一定要去看下储狭,里面幾個關鍵的類要記住互婿,還有連接池,攔截器都需要理解辽狈。被問到如何給某些特定域名的url增加header慈参,如果是自己封裝的代碼,可以在封裝Request中可以解決刮萌,也可以增加攔截器驮配,通過攔截器去做。
推薦一篇講解Okhttp不錯的文章
二着茸、消息通知 EventBus
1.EventBus原理:建議看下源碼壮锻,不多。內(nèi)部實現(xiàn):觀察者模式+注解+反射
2.EventBus可否跨進程問題涮阔?代替EventBus的方法(RxBus)
三躯保、圖片加載庫(Fresco、Glide澎语、Picasso)
1.項目中選擇了哪個圖片加載庫?為什么選擇它验懊?其他庫不好嗎擅羞?這幾個庫的區(qū)別
2.項目中選擇圖片庫它的原理,如Glide(LruCache結合弱引用)义图,那么面試官會問LruCache原理减俏,進而問LinkedHashMap原理,這樣一層一層地問碱工,所以建議看到不懂的追進去看娃承。如Fresco是用來MVC設計模式,5.0以下是用了共享內(nèi)存怕篷,那共享內(nèi)存怎么用历筝?Fresco怎么實現(xiàn)圓角?Fresco怎么配置緩存廊谓?
四梳猪、消息推送Push
1.項目中消息推送是自己做的還是用了第三方?如極光蒸痹。還有沒有用過其他的春弥?這幾家有什么優(yōu)勢區(qū)別呛哟,基于什么原因選擇它的?
2.消息推送原理是什么匿沛?如何實現(xiàn)心跳連接扫责?
五、TCP/IP逃呼、Http/Https
網(wǎng)絡這一塊如果簡歷中寫道熟悉TCP/IP協(xié)議鳖孤,Http/Https協(xié)議,那么肯定會被問道蜘渣,我就驗證了淌铐。一般我會回答網(wǎng)絡層關系、TCP和UDP的區(qū)別蔫缸,TCP三次握手(一定要講清楚腿准,SYN、ACK等標記位怎樣的還有報文結構都需要熟悉下)拾碌,四次揮手吐葱。為什么要三次握手?DDoS攻擊校翔。為什么握手三次弟跑,揮手要四次?Http報文結構防症,一次網(wǎng)絡請求的過程是怎樣的孟辑?Http和Https有什么不同?SSL/TLS是怎么進行加密握手的蔫敲?證書怎么校驗饲嗽?對稱性加密算法和非對稱加密算法有哪些?挑一個熟悉的加密算法簡單介紹下奈嘿?DNS解析是怎樣的貌虾?
六、熱更新裙犹、熱修復尽狠、插件化(這一塊要求高點,一般高級工程師是需要理解的)
了解classLoader
七叶圃、新技術
RxJava袄膏、RxBus、RxAndroid盗似,這個在面試想去的公司時哩陕,可以反編譯下他們的包,看下是不是用到,如果用到了悍及,面試過程難免會問道闽瓢,如果沒有,也可以忽略心赶,但學習心強的同學可以看下扣讼,比較是比較火的框架。
Retrofit缨叫,熟練okhttp的同學建議看下椭符,聽說結合RxJava很爽。
Kotlin
三耻姥、最后
簡歷首選內(nèi)推方式销钝,速度快,效率高八龃亍蒸健!然后可以在拉鉤,boss婉商,脈脈似忧,大街上看看。簡歷上寫道熟悉什么技術就一定要去熟悉它丈秩,不然被問到不會很尷尬盯捌!做過什么項目,即使項目體量不大蘑秽,但也一定要熟悉實現(xiàn)原理饺著!不是你負責的部分,也可以看看同事是怎么實現(xiàn)的肠牲,換你來做你會怎么做瓶籽?做過什么,會什么是廣度問題埂材,取決于項目內(nèi)容。但做過什么汤求,達到怎樣一個境界俏险,這是深度問題,和個人學習能力和解決問題的態(tài)度有關了扬绪。大公司看深度竖独,小公司看廣度。大公司面試你會的挤牛,小公司面試他們用到的你會不會莹痢,也就是崗位匹配度。
選定你想去的幾家公司后,先去一些小的公司練練竞膳,學習下面試技巧航瞭,總結下,也算是熟悉下面試氛圍坦辟,平時和同事或者產(chǎn)品PK時可以講得頭頭是道刊侯,思路清晰至極,到了現(xiàn)場真的不一樣锉走,怎么描述你所做的一切滨彻,這絕對是個學術性問題!
面試過程一定要有禮貌挪蹭!即使你覺得面試官不尊重你亭饵,經(jīng)常打斷你的講解,或者你覺得他不如你梁厉,問的問題缺乏專業(yè)水平辜羊,你也一定要尊重他,誰叫現(xiàn)在是他選擇你懂算,等你拿到offer后就是你選擇他了只冻。
另外,描述問題一定要慢计技!不要一下子講一大堆喜德,慢顯得你沉穩(wěn)、自信垮媒,而且你還有時間反應思路接下來怎么講更好∩崦酰現(xiàn)在開發(fā)過多依賴ide,所以會有個弊端睡雇,當我們在面試講解很容易不知道某個方法怎么讀萌衬,這是一個硬傷......所以一定要對常見的關鍵性的類名、方法名它抱、關鍵字讀準秕豫,有些面試官不耐煩會說“你到底說的是哪個?”這時我們會容易亂了陣腳观蓄。正確的發(fā)音+沉穩(wěn)的描述+好聽的嗓音決對是一個加分項混移!
最重要的是心態(tài)!心態(tài)侮穿!心態(tài)歌径!重要事情說三遍!面試時間很短亲茅,在短時間內(nèi)對方要摸清你的底子還是比較不現(xiàn)實的回铛,所以狗准,有時也是看眼緣,這還是個看臉的時代茵肃。
希望大家都能找到合適自己滿意的工作腔长!fighting!