2021年最新Android開發(fā)面試經(jīng)驗(一):字節(jié)跳動


以下純屬個人面試經(jīng)驗分享,望對各位同仁有幫助

本人基本情況是:16年畢業(yè)于211院校本科,19-21年在Oppo工作,算是有大廠經(jīng)驗了
面試的崗位是:
Android應(yīng)用開發(fā)工程師
職位描述
1、負(fù)責(zé)手機端系統(tǒng)應(yīng)用的功能開發(fā),維護和問題修復(fù);
2、負(fù)責(zé)所維護模塊的性能優(yōu)化,如冷熱啟動指標(biāo)優(yōu)化,滾動優(yōu)化等;
3、負(fù)責(zé)所維護模塊的內(nèi)存問題處理,包括解決內(nèi)存泄漏,內(nèi)存調(diào)優(yōu)等。
職位要求
1、本科以上學(xué)歷,計算機或相關(guān)專業(yè),3年以上Android實際開發(fā)經(jīng)驗
2、熟練掌握J(rèn)ava語言或C++語言,熟練掌握面向?qū)ο缶幊?,熟悉Android平臺的應(yīng)用設(shè)計規(guī)范、具有良好的編程習(xí)慣和代碼規(guī)范意識,熟悉Android平臺下的代碼調(diào)試和調(diào)優(yōu)技術(shù);
3、熟練掌握Android IPC 機制,熟練運用四大組件進行需求開發(fā),有對Framework 如AMS,WMS了解的優(yōu)先;
4、熟練掌握TCP, Http,Https等通訊協(xié)議,熟練使用OKHttp 或 Http其他工具類進行網(wǎng)絡(luò)編程;
5、熟練掌握Android UI編程,動畫編程,對Android事件分發(fā)流程,View繪制流程,自定義View 有較深理解;
6、有過Android系統(tǒng)級應(yīng)用經(jīng)驗者優(yōu)先;
7、了解并使用過開源框架或技術(shù)如 Rxjava,Retrofit,EventBus,Android JetPack,OpenGL,組件化開發(fā)經(jīng)驗者優(yōu)先;
8、有技術(shù)亮點與技術(shù)熱情,希望對某種技術(shù)有較深的研究,例如圖形,網(wǎng)絡(luò),瀏覽器等;
9、具備積極進取踏實負(fù)責(zé)的工作態(tài)度,強烈的團隊合作意識, 能承受工作壓力。

面試過程

1、主要是項目經(jīng)驗(占面試時間的40%)

沒有問所有項目,你自己挑一個最難的項目來講
突出項目難點,項目特色,項目突出貢獻,要做到通俗易懂,視頻面試沒法畫框架圖

2、突出三方能力,要了解核心思想(占面試時間的20%,如果用得多可能會聊更久)

比如:OkHttp,retrofit,RxJava,EventBus,
比如:OkHttp基本原理,緩存原理,連接池原理,
如果每個請求都需要在url里添加字段,如何用Interceptor實現(xiàn)
retrofit的核心設(shè)計思想
參考鏈接:
OkHttp緩存原理分析
okHttp使用和原理分析

3、android基礎(chǔ)(占面試時間的20%)

3.1、Handler實現(xiàn)原理

參考鏈接:android Handler機制原理解析(一篇就夠,包你形象而深刻)(https://blog.csdn.net/luoyingxing/article/details/86500542)

3.1.1、Looper.loop()源碼,即實現(xiàn)原理

3.1.2、Handler.postDelay()實現(xiàn)原理

參考鏈接:你真的懂Handler.postDelayed()的原理嗎?(https://blog.csdn.net/qingtiantianqing/article/details/72783952)
基本情況是:
如果頭部的這個Message是有延遲而且延遲時間沒到的(now < msg.when),會計算一下時間(保存為變量nextPollTimeoutMillis),
然后在循環(huán)開始的時候判斷如果這個Message有延遲,就調(diào)用nativePollOnce(ptr, nextPollTimeoutMillis)進行阻塞。nativePollOnce()的作用類似與object.wait(),只不過是使用了Native的方法對這個線程精確時間的喚醒。

如果Message會阻塞MessageQueue的話,那么先postDelay10秒一個Runnable A,消息隊列會一直阻塞,然后我再post一個Runnable B,B豈不是會等A執(zhí)行完了再執(zhí)行?正常使用時顯然不是這樣的,那么問題出在哪呢?
1、postDelay()一個10秒鐘的Runnable A、消息進隊,MessageQueue調(diào)用nativePollOnce()阻塞,Looper阻塞;

2、緊接著post()一個Runnable B、消息進隊,判斷現(xiàn)在A時間還沒到、正在阻塞,把B插入消息隊列的頭部(A的前面),然后調(diào)用nativeWake()方法喚醒線程;

3、MessageQueue.next()方法被喚醒后,重新開始讀取消息鏈表,第一個消息B無延時,直接返回給Looper;

4、Looper處理完這個消息再次調(diào)用next()方法,MessageQueue繼續(xù)讀取消息鏈表,第二個消息A還沒到時間,計算一下剩余時間(假如還剩9秒)繼續(xù)調(diào)用nativePollOnce()阻塞;

5、直到阻塞時間到或者下一次有Message進隊;

3.2、Activity的生命周期,還有各場景下,各個生命周期的回調(diào)方法

參考鏈接:深入理解Activity的生命周期(http://www.itdecent.cn/p/fb44584daee3)

核心知識點:
onStart:start表示啟動,這是Activity生命周期的第二個方法。此時Activity已經(jīng)可見了,但是還沒出現(xiàn)在前臺,我們還看不到,無法與Activity交互。
onResume:resume表示繼續(xù)、重新開始,這名字和它的職責(zé)也相同。Activity在這個階段已經(jīng)出現(xiàn)在前臺并且可見了。
onPause:pause表示暫停,當(dāng)Activity要跳到另一個Activity或應(yīng)用正常退出時都會執(zhí)行這個方法。此時Activity在前臺并可見,我們可以進行一些輕量級的存儲數(shù)據(jù)和去初始化的工作,不能太耗時,因為在跳轉(zhuǎn)Activity時只有當(dāng)一個Activity執(zhí)行完了onPause方法后另一個Activity才會啟動,而且android中指定如果onPause在500ms即0.5秒內(nèi)沒有執(zhí)行完畢的話就會強制關(guān)閉Activity。
onStop:stop表示停止,此時Activity已經(jīng)不可見了,但是Activity對象還在內(nèi)存中,沒有被銷毀。
這個階段的主要工作也是做一些資源的回收工作。

3.2.1、在AActivity界面點擊按鈕后,跳轉(zhuǎn)到BActivity界面,各個activity的生命周期回調(diào)順序
答:(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop

3.2.2、在A界面點擊按鈕后,即startActivity(B)之后調(diào)了finish()方法,各個activity的生命周期回調(diào)順序
答:(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop→(A)onDestory

3.2.3、在A界面,啟動了一個透明的B界面,各個activity的生命周期回調(diào)順序
答:(A)onPause→(B)onCreate→(B)onStart→(B)onResume

3.2.4、在A界面,啟動了一個Dialog,activity的生命周期回調(diào)順序
答:不會回調(diào)任何函數(shù)。

3.2.5、在A界面,啟動了一個主題是Dialog的B界面,各個activity的生命周期回調(diào)順序
答:(等測試)

4、算法題(占面試時間20%)

面試特點:鏈表相關(guān)算法必須順便,大廠常考題目,可以刷leetcode里的題目,要自己動手寫,別光看題目和解析,只有自己真正思考題目,模擬考試了,才知道自己的核心問題出在哪,怎么提升

4.1、兩個雙向鏈表,返回第一個相同節(jié)點

答:解題思路:
4.1.1、尋找返回結(jié)果的特性:
第一相同節(jié)點后的內(nèi)容,兩個鏈表后半段內(nèi)容都一樣
4.1.2、如果是基于多個數(shù)據(jù)的計算,先對齊數(shù)據(jù)關(guān)鍵特性:
這里的關(guān)鍵特性就是鏈表的長度,便于依次對比節(jié)點相等
解決方案就是:獲取鏈表長度,先遍歷長的鏈表,讓兩個鏈表長度對齊
4.1.3、遍歷數(shù)據(jù),指針概念:
這里使用雙指針概念,一個指針遍歷短的鏈表,另外一個指針遍歷長的鏈表

參考答案:
public ListNodetest(ListNode listNode1, ListNode listNode2) {
????if ((listNode1 ==null) || (listNode2 ==null)) {
????????return null;
????}
????int length1 = length(listNode1);
????int length2 = length(listNode2);
????ListNode shortListNode = length1 > length2 ? listNode2 : listNode1;
????ListNode longListNode = length1 > length2 ? listNode1 : listNode2;
? ? int offset = Math.abs(length1 - length2);
????for (int i =0; i < offset; i++) {
????????if (longListNode ==null) {
????????????return null;
????????}
????????longListNode = longListNode.next;
????}
????while ((longListNode !=null)
????????&& (shortListNode !=null)
????????&& (longListNode.next != shortListNode.next)) {
????????????shortListNode = shortListNode.next;
? ? ????????longListNode = longListNode.next;
????}
????return longListNode;
}

private int length(ListNode listNode) {
????ListNode temp = listNode;
? ? int length =0;
? ? while (temp !=null) {
????????length++;
????????temp = temp.next;
????}
? ? return length;
}

5、其他大廠有面試,但是字節(jié)面試官沒有提到的內(nèi)容

java虛擬機相關(guān):內(nèi)存模型,GC回收機制,同步處理volatile、synchronize
排序算法
線程池:徹底理解Java線程池原理篇
android其他相關(guān)的:ANR原理,AIDL原理

總結(jié):
1、面試官人很好,可以有你來主導(dǎo)部分面試內(nèi)容,需要準(zhǔn)備好項目經(jīng)驗,突出項目難點,痛點;
2、準(zhǔn)備好三方能力的原理,有深入了解過設(shè)計思想,實現(xiàn)方式,是加分項
3、算法題,可以事先和面試官溝通,解題思路,如果有重大漏洞,及時想第二種方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 128,087評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標(biāo)可以實時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,361評論 1 6
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,814評論 28 54
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,759評論 2 9

友情鏈接更多精彩內(nèi)容