1. 程式人生 > >2018 Android面試心得,已拿到offer

2018 Android面試心得,已拿到offer

從16年畢業至今,就職過兩家公司,大大小小專案做了幾個,非常感謝我的兩位老大,在我的android成長路上給予我很多指導,亦師亦友的關係。

從年前至今參加面試了很多公司,也收到了幾家巨頭的offer,還有其他公司的。總結下經驗,也是對過去的一個回顧和總結吧。

一、簡歷

網上有很多對程式設計師簡歷的一些指導,這裡就不重述,大家可以搜下網上其他大神的總結,結合自身情況修改下。我有幾點建議:

1.儘量不要花哨,程式設計師和設計師或者產品運營還不一樣,我們的簡歷成功與否決定權還是在技術面試官那,而他們看重的是你的專案經驗內容和技術等描述。

2.技能描述這塊儘量只寫你懂得而且理解深刻的,可以適當加入一些新技術或流行框架,不過這塊需要理解,沒來得及看原始碼的可以看看大神們對它的總結,網上一大堆。

3.專案經驗這塊儘量加入關鍵詞,比如使用了什麼技術、用到哪些設計模式、優化資料對比、擴充套件總結之類的。而非一味地介紹這個專案內容(那是產品經理的描述),比如效能優化這塊,分為UI效能優化、記憶體優化、資料庫優化、網路優化、耗電優化等等。可以從1.如何發現問題,2.怎麼解決問題,3.解決效果對比,這幾個方面去描述。舉個簡單例子——UI優化,可以從 UI出現什麼問題(卡頓不流暢),怎麼查詢問題(手機開發者許可權>GPU過度繪製 發現層級問題,TraceView CPU使用情況分析),怎麼解決問題(降低層級、自定義View繪圖出現問題等),解決問題後效能再次對比。

二、技能儲備

(一)Java

一、HashMap和Hashtable區別?

這個一定要去看原始碼!看原始碼!看原始碼!實在看不下去的可以上網看別人的分析。簡單總結有幾點:

1.HashMap支援null Key和null Value;Hashtable不允許。這是因為HashMap對null進行了特殊處理,將null的hashCode值定為了0,從而將其存放在雜湊表的第0個bucket。

2.HashMap是非執行緒安全,HashMap實現執行緒安全方法為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,記憶體劃分——方法區、記憶體堆、虛擬機器棧(執行緒私有)、本地方法棧(執行緒私有)、程式計數器(執行緒私有), 理解回收演算法——標記清除演算法、可達性分析演算法、標記-整理演算法、複製演算法、分代演算法,優缺點都理解下。

詳細的可以看看其他同學寫的 點選開啟連結

三、類載入機制

這個可以結合 熱修復 深入理解下。點選開啟連結

四、執行緒和執行緒池,併發,鎖等一系列問題

這個可以擴充套件下 如何自己實現一個執行緒池?

五、HandlerThread、IntentService理解

六、弱引用、軟引用區別

七、int、Integer有什麼區別

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

八、手寫生產者/消費者 模式

(二)Android

一、android啟動模式

需要了解下Activity棧和taskAffinity

1.Standard:系統預設,啟動一個就多一個Activity例項

2.SingleTop:棧頂複用,如果處於棧頂,則生命週期不走onCreate()和onStart(),會呼叫onNewIntent(),適合推送訊息詳情頁,比如新聞推送詳情Activity;

3.SingleTask:棧內複用,如果存在棧內,則在其上所有Activity全部出棧,使得其位於棧頂,生命週期和SingleTop一樣,app首頁基本是用這個

4.SingleInstance:這個是SingleTask加強本,系統會為要啟動的Activity單獨開一個棧,這個棧裡只有它,適用新開Activity和app能獨立開的,如系統鬧鐘,微信的視訊聊天介面不知道是不是,知道的同學告訴我下,在此謝過!

另外,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個引數的,和不帶引數有什麼區別;requestLayout觸發measure和layout,如何實現區域性重新測量,避免全域性重新測量問題。

三、事件分發機制

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

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

四、訊息分發機制

這個考得非常常見。一定要看原始碼,程式碼不多。帶著幾個問題去看:

1.為什麼一個執行緒只有一個Looper、只有一個MessageQueue?

2.如何獲取當前執行緒的Looper?是怎麼實現的?(理解ThreadLocal)

3.是不是任何執行緒都可以例項化Handler?有沒有什麼約束條件?

4.Looper.loop是一個死迴圈,拿不到需要處理的Message就會阻塞,那在UI執行緒中為什麼不會導致ANR?

5.Handler.sendMessageDelayed()怎麼實現延遲的?結合Looper.loop()迴圈中,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。

五、AsyncTask原始碼分析

優劣性分析,這個網上一大堆,不重述。

六、如何保證Service不被殺死?如何保證程序不被殺死?

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

七、Binder機制,程序通訊

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

八、動態許可權適配問題、換膚實現原理

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

九、SharedPreference原理,能否跨程序?如何實現?

(三)效能優化問題

一、UI優化

a.合理選擇RelativeLayout、LinearLayout、FrameLayout,RelativeLayout會讓子View呼叫2次onMeasure,而且佈局相對複雜時,onMeasure相對比較複雜,效率比較低,LinearLayout在weight>0時也會讓子View呼叫2次onMeasure。LinearLayout weight測量分配原則。

b.使用標籤<include><merge><ViewStub>

c.減少佈局層級,可以通過手機開發者選項>GPU過渡繪製檢視,一般層級控制在4層以內,超過5層時需要考慮是否重新排版佈局。

d.自定義View時,重寫onDraw()方法,不要在該方法中新建物件,否則容易觸發GC,導致效能下降

e.使用ListView時需要複用contentView,並使用Holder減少findViewById載入View。

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

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

二、記憶體優化

主要為了避免OOM和頻繁觸發到GC導致效能下降

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

b.大量載入Bitmap時,根據View大小載入Bitmap,合理選擇inSampleSize,RGB_565編碼方式;使用LruCache快取

c.使用 靜態內部類+WeakReference 代替內部類,如Handler、執行緒、AsyncTask

d.使用執行緒池管理執行緒,避免執行緒的新建

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

f.靜態集合物件注意釋放

g.屬性動畫造成記憶體洩露

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

備:使用LeakCanary檢測記憶體洩露

三、響應速度優化

Activity如果5秒之內無法響應螢幕觸碰事件和鍵盤輸入事件,就會出現ANR,而BroadcastReceiver如果10秒之內還未執行操作也會出現ANR,Serve20秒會出現ANR 為了避免ANR,可以開啟子執行緒執行耗時操作,但是子執行緒不能更新UI,因此需要Handler訊息機制、AsyncTask、IntentService進行執行緒通訊。

備:出現ANR時,adb pull data/anr/tarces.txt 結合log分析

四、其他效能優化

a.常量使用static final修飾

b.使用SparseArray代替HashMap

c.使用執行緒池管理執行緒

d.ArrayList遍歷使用常規for迴圈,LinkedList使用foreach

e.不要過度使用列舉,列舉佔用記憶體空間比整型大

f.字串的拼接優先考慮StringBuilder和StringBuffer

g.資料庫儲存是採用批量插入+事務

(四)設計模式

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

2.觀察者模式:要求會手寫,有些面試官會問你在專案中用到了嗎?實在沒有到的可以講一講EventBus,它用到的就是觀察者模式

3.介面卡模式:要求會手寫,有些公司會問和裝飾器模式、代理模式有什麼區別?

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

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

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

(五)資料結構

1.HashMap、LinkedHashMap、ConcurrentHashMap,在用法和原理上有什麼差異,很多公司會考HashMap原理,通過它做一些擴充套件,比如中國13億人口年齡的排序問題,年齡對應桶的個數,年齡相同和hash相同問題類似。

2.ArrayList和LinkedList對比,這個相對簡單一點。

3.平衡二叉樹、二叉查詢樹、紅黑樹,這幾個我也被考到。

4.Set原理,這個和HashMap考得有點類似,考hash演算法相關,被問到過常用hash演算法。HashSet內部用到了HashMap

(六)演算法

演算法主要考刷題吧,去LeetCode牛客網刷下。

(七)原始碼理解

專案中多多少少會用到開源框架,很多公司都喜歡問原理和是否看過原始碼,比如網路框架Okhttp,這是最常用的,現在Retrofit+RxJava也很流行。

一、網路框架庫 Okhttp

okhttp原始碼一定要去看下,裡面幾個關鍵的類要記住,還有連線池,攔截器都需要理解。被問到如何給某些特定域名的url增加header,如果是自己封裝的程式碼,可以在封裝Request中可以解決,也可以增加攔截器,通過攔截器去做。

推薦一篇講解Okhttp不錯的文章

二、訊息通知 EventBus

1.EventBus原理:建議看下原始碼,不多。內部實現:觀察者模式+註解+反射

2.EventBus可否跨程序問題?代替EventBus的方法(RxBus)

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

1.專案中選擇了哪個圖片載入庫?為什麼選擇它?其他庫不好嗎?這幾個庫的區別

2.專案中選擇圖片庫它的原理,如Glide(LruCache結合弱引用),那麼面試官會問LruCache原理,進而問LinkedHashMap原理,這樣一層一層地問,所以建議看到不懂的追進去看。如Fresco是用來MVC設計模式,5.0以下是用了共享記憶體,那共享記憶體怎麼用?Fresco怎麼實現圓角?Fresco怎麼配置快取?

四、訊息推送Push

1.專案中訊息推送是自己做的還是用了第三方?如極光。還有沒有用過其他的?這幾家有什麼優勢區別,基於什麼原因選擇它的?

2.訊息推送原理是什麼?如何實現心跳連線?

五、TCP/IP、Http/Https

網路這一塊如果簡歷中寫道熟悉TCP/IP協議,Http/Https協議,那麼肯定會被問道,我就驗證了。一般我會回答網路層關係、TCP和UDP的區別,TCP三次握手(一定要講清楚,SYN、ACK等標記位怎樣的還有報文結構都需要熟悉下),四次揮手。為什麼要三次握手?DDoS攻擊。為什麼握手三次,揮手要四次?Http報文結構,一次網路請求的過程是怎樣的?Http和Https有什麼不同?SSL/TLS是怎麼進行加密握手的?證書怎麼校驗?對稱性加密演算法和非對稱加密演算法有哪些?挑一個熟悉的加密演算法簡單介紹下?DNS解析是怎樣的?

六、熱更新、熱修復、外掛化(這一塊要求高點,一般高階工程師是需要理解的)

瞭解classLoader

七、新技術

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

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

Kotlin

三、最後

簡歷首選內推方式,速度快,效率高啊!然後可以在拉鉤,boss,脈脈,大街上看看。簡歷上寫道熟悉什麼技術就一定要去熟悉它,不然被問到不會很尷尬!做過什麼專案,即使專案體量不大,但也一定要熟悉實現原理!不是你負責的部分,也可以看看同事是怎麼實現的,換你來做你會怎麼做?做過什麼,會什麼是廣度問題,取決於專案內容。但做過什麼,達到怎樣一個境界,這是深度問題,和個人學習能力和解決問題的態度有關了。大公司看深度,小公司看廣度。大公司面試你會的,小公司面試他們用到的你會不會,也就是崗位匹配度。

選定你想去的幾家公司後,先去一些小的公司練練,學習下面試技巧,總結下,也算是熟悉下面試氛圍,平時和同事或者產品PK時可以講得頭頭是道,思路清晰至極,到了現場真的不一樣,怎麼描述你所做的一切,這絕對是個學術性問題!

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

另外,描述問題一定要慢!不要一下子講一大堆,慢顯得你沉穩、自信,而且你還有時間反應思路接下來怎麼講更好。現在開發過多依賴ide,所以會有個弊端,當我們在面試講解很容易不知道某個方法怎麼讀,這是一個硬傷......所以一定要對常見的關鍵性的類名、方法名、關鍵字讀準,有些面試官不耐煩會說“你到底說的是哪個?”這時我們會容易亂了陣腳。正確的發音+沉穩的描述+好聽的嗓音決對是一個加分項!

最重要的是心態!心態!心態!重要事情說三遍!面試時間很短,在短時間內對方要摸清你的底子還是比較不現實的,所以,有時也是看眼緣,這還是個看臉的時代。

希望大家都能找到合適自己滿意的工作!fighting!

相關推薦

2018 Android面試心得offer

從16年畢業至今,就職過兩家公司,大大小小專案做了幾個,非常感謝我的兩位老大,在我的android成長路上給予我很多指導,亦師亦友的關係。從年前至今參加面試了很多公司,也收到了幾家巨頭的offer,還有其他公司的。總結下經驗,也是對過去的一個回顧和總結吧。一、簡歷網上有很多對

2018 BAT春招已經開始Offer的百度阿里的iOS面試總結分享給你(附面經)

前言:隨著各大公司春招的開始,很多小夥伴都行動起來了,因此這篇總結並不一定適合想去創業公司的同學。另外,由於經驗本來就是主觀性極強的東西,加之筆者水平有限,所以如果有不認可的地方,萬望諸君呵呵一笑,拋之腦後。接下來,我就斗膽分享一下自己在準備和參加面試的過程中的收穫、對面試的

2018騰訊Android面經(offer

騰訊校招面試的基本套路是,自我介紹、專案、網路、演算法。其中專案會問的很深,要提前準備。 一面(1h) 自我介紹 問專案 Android優化做過沒有 ListView優化方法 如何統計ListView載入速度 Http包頭 Get

秋招面試經驗分享-阿里cvte迅雷網龍美團Offer

什麼是秋招 針對秋招一般是在9-10月份,到11月份後還在招聘的公司就很少了,在7-8月份一般都會有秋招內推。 關於秋招內推可以找自己認識的學長學姐或論壇上的某公司的職員進行內推,這個其實牛客網上在7-8月份會有很多的內推。 關於正式秋招主要在9-10月份

虎牙直播 2019暑期實習生-Android開發 面試經歷(offer

一面 兩個執行緒,一個執行緒輸出”A”,一個執行緒輸出”B”,使用兩個執行緒輸出”ABABABABABAB”,要保證輸出的次序。 int c = 5;在編譯生成可執行檔案後這個變數儲存在檔案的什麼位

中科軟面試經歷offer請大佬給點意見。

今天去了中科軟,先筆試,筆試完了,面試,面試官和我聊得都很開心,技術上感覺面試官不是大牛。當場給了我offer。我要的工資是8K。在網上查了一下這個公司,基本都是負面的資訊。現在猶豫要不要去。。。。。請大佬給點意見。。 現在來補充:offer已經委婉拒絕,這裡再次感謝中科軟能

2019騰訊校園招聘開發崗面經(一面+二面+HR面)offer

2019騰訊校園招聘開發崗面經(一面+二面+HR面) 背景: 華為實習結束前兩天,突然接到騰訊的郵件,邀請我現場面試,但面試前需要我做道題,這道題的回答內容將作為一面時的溝通話題(當時整個人是懵的,咋還有這操作)。暑期實習投的騰訊是安卓崗,華為實習期間是軟體開發崗,最後拿到騰訊off

騰訊2017校招實習生面試總結 騰訊實習生面試經驗 (offer

從三月份開始,就投入了緊張的校招實習生準備當中。因為自己深知這次機會的重要性以及必要性。一開始,只鎖定了騰訊和阿里的內推。三月初,在支付寶師兄的幫助下,成功獲得內推資格。師兄給了很多建議,支付寶可能更喜歡問架構、設計以及思考相關的問題。實際上,這樣開放性的考綱更難去複習。因為

美團實習Java崗面經offer

今天剛剛收到hr的電話,開心,簡單記錄一下美團的面經。時間隔的比較久了,簡單回憶下,最後會給出我之前整理的別人的面經 一面 1點50開始一面的。簡單自我介紹,問了下java基礎的東西比如volite關鍵字,同步的方法,悲觀鎖和樂觀鎖等等。jvm相關的

蘑菇街JAVA面試總結(offer)

面試職位:JAVA開發實習大三下,一名普通二本學校物聯網工程專業的學生,從這學期開學一直到現在,前前後後兩個月的時間,準備實習,各個公司面試(北京隨身雲,今日頭條,深證花兒綻放,蘇州蘑菇雲等),直到昨天拿到了蘑菇街的offer,在此作出總結,共勉。我自己的總結,找實習注重四個

Java程序員從京東、阿裏、攜程面試回來成功到京東offer

Java 程序員 互聯網 後端 編程語言 阿裏巴巴(一面)阿裏找了一個前輩內推的,準確來說應該是直推,是他幫我直接錄的簡歷,他本科進的阿裏螞蟻金服,厲害吧?是真的佩服。第一次在官網上填資料,想想馬雲有多出名,想想螞蟻金服這樣的頂級技術,有些興奮,有些期待。錄完簡歷後等待簡歷評估,原來,找內

三年前端面試思考(到頭條、螞蟻、美團offer

背景介紹 985本科,軟體工程專業,前端。 工作三年半,第一家創業公司,半年。 第二家前端技術不錯的公司,兩年半。 第三家,個人創業半年。 可以看出,我是個很喜歡折騰的人,大學期間也做過很多專案,非常願意參與到產品中去。技術上勉強合格,不過獨自負責過很複雜的前端專案,所以一般基礎面試題還有專案經歷都

2018網易雷火前端實習面試面經(offer

總概 樓主是電子科技大學大三的學生,初投了一下網易雷火工作室的前端開發實習崗,一週內完成了三面,且在當天已經拿到offer。說一下面試的流程和題目。總體來說,網易會關注一些平時看書或者面經不太會想到的東西,面試官問的比較偏(脫離常規),常規問題,例如:閉包、繼承

Java程式設計師從京東、阿里、攜程面試回來成功到京東offer

阿里巴巴(一面) 阿里找了一個北郵學長的內推,準確來說應該是直推,是他幫我直接錄的簡歷,他本科進的阿里螞蟻金服,厲害吧?是真的佩服。第一次在官網上填資料,想想馬雲有多出名,想想螞蟻金服這樣的頂級技術,有些興奮,有些期待。 錄完簡歷後等待簡歷評估,原來,找內推不一定能得到面試機會,能不能得到面試機會要經過簡歷

程式設計師從京東、阿里、攜程面試回來成功到京東offer

阿里巴巴(一面)阿里找了一個北郵學長的內推,準確來說應該是直推,是他幫我直接錄的簡歷,他本科進的阿里螞蟻金服,厲害吧?是真的佩服。第一次在官網上填資料,想想馬雲有多出名,想想螞蟻金服這樣的頂級技術,有些興奮,有些期待。錄完簡歷後等待簡歷評估,原來,找內推不一定能得到面試機會,

360內推Android面經 - 2018offer

上週參加了360的內推面試,一天3面,兩輪技術,一輪HR。不得不說效率很高。和其他公司隔幾天再面相比,感覺最重要的是能夠及時的知道自己過沒過,不用焦急的等待後續面試通知。差不多一週左右的時間,offer意向書已經發放,效率很高。 以下是我的面經,供參考。 一面

我的實習面經(Android開發阿里華為CVTE Offer

忙過了一段時間,終於有空坐下來寫一篇面經,記錄一下自己前面一段時間找實習的過程和經驗,希望對閱讀到這篇面經的你有所幫助。 先介紹一下我的基本情況: 學校專業:本人某普通211通訊工程專業本科生(非計算機科班出身)。 面試崗位:Android

13道Java面試真題OFFER必看Java核心的常見問題都在這

上海尚學堂Java培訓學員參加面試帶回來的真題,分享出來與大家,希望大家能認真地看看做一遍。後面有詳細題解答案,對照下,看看自己做得怎麼樣,把這些面試遇到的真題全部掌握,做好面試筆試前的準備。   一、13個面試題目 先自己看看這題目,動手做一做,然後再對照後面的答案。 第

工作2年半跳槽面試阿里成功offer

2015年剛畢業的我,進入了一家小小的公司實習工作,在學校學了三年軟體開發的我,還是想去尋找一份網際網路行業的工作,這樣更能學以致用發揮自己的特長。一直到18年三月份,我辭掉已有的工作,北上去面試,且成功拿到offer,面試回來後,好多人問我,你憑什麼能拿到阿里的offer,你只不過是剛畢業工作兩年的小白。當

2018百度測試開發面經(offer

一開始報的Android開發,但是後來電話通知我今年武漢沒有Android開發,要不要轉成移動測試。我就轉崗了。百度加起來一起有四面,第一面大概是評估面,第二天連續三面。 每一面的流程基本一致,主要是自我介紹,專案,測試相關,手寫程式碼。 評估面 自我介紹