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


以下純屬個(gè)人面試經(jīng)驗(yàn)分享,望對(duì)各位同仁有幫助

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

面試過程

1、主要是項(xiàng)目經(jīng)驗(yàn)(占面試時(shí)間的40%)

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

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

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

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

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

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

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

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

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

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

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

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

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

5、直到阻塞時(shí)間到或者下一次有Message進(jìn)隊(duì);

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

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

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

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

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

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

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

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

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

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

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

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

參考答案:
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é)面試官?zèng)]有提到的內(nèi)容

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

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

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

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

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