2018 Android面試心得松靡,已拿到offer

從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!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末免姿,一起剝皮案震驚了整個濱河市饼酿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胚膊,老刑警劉巖故俐,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異紊婉,居然都是意外死亡药版,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門喻犁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槽片,“玉大人,你說我怎么就攤上這事肢础』顾ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵传轰,是天一觀的道長剩盒。 經(jīng)常有香客問我,道長慨蛙,這世上最難降的妖魔是什么辽聊? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮期贫,結果婚禮上跟匆,老公的妹妹穿的比我還像新娘。我一直安慰自己通砍,他們只是感情好玛臂,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著封孙,像睡著了一般垢揩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敛瓷,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音斑匪,去河邊找鬼呐籽。 笑死锋勺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的狡蝶。 我是一名探鬼主播庶橱,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贪惹!你這毒婦竟也來了苏章?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤奏瞬,失蹤者是張志新(化名)和其女友劉穎枫绅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼端,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡并淋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了珍昨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片县耽。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镣典,靈堂內(nèi)的尸體忽然破棺而出兔毙,到底是詐尸還是另有隱情,我是刑警寧澤兄春,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布澎剥,位于F島的核電站,受9級特大地震影響神郊,放射性物質發(fā)生泄漏肴裙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一涌乳、第九天 我趴在偏房一處隱蔽的房頂上張望蜻懦。 院中可真熱鬧,春花似錦夕晓、人聲如沸宛乃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽征炼。三九已至,卻和暖如春躬贡,著一層夾襖步出監(jiān)牢的瞬間谆奥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工拂玻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酸些,地道東北人宰译。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像魄懂,于是被迫代替她去往敵國和親沿侈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容