作者:小謝
“你遇到過哪些高質量的Android面試?”
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3Pc1xZw5-1691675604271)(//upload-images.jianshu.io/upload_images/24388310-aa3c732481d0749f.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200)]
這是我前幾天在知乎上面看到一個熱門話題,看到后起了興趣就試著往下翻了翻,看到下面的回答都是在分享、講述自己的面試經歷、面試感受以及面試后感想和總結。不妨的說很精彩。
但是看到提問時間是在3年前,為什么3年后的今天還能掀起熱浪呢?
想著這個問題,我就把問答完整的閱讀了一遍。想了提問時間,又想到了我收到的推送時間。才明白原來快到了“金九銀十跳槽黃金期”,大部分的程序員都在躍躍欲試,所以三年前的問答就再度掀起熱浪。
想想我在互聯網行業(yè)已經吃了三年的青春飯,這幾年面試過的大廠不少于十家。拿到了offer也有3家,其中包含了小米、網易、還有一個新浪,現在在字節(jié)跳動劃水摸魚,有機會一起哈!我拿到手的offer的平均水平都在24K——27K 左右(工作1—2年),借著問答的機會作一波面試復盤。
一、A公司
1、介紹項目
我之前是做了新聞App,相當于低仿的今日頭條吧!
基本功能:
-
歡迎頁面加載(3s,點擊可跳過)——Activity相關
-
用戶注冊/登錄 ——SQLite運用
-
橫向滑動列表顯示新聞類別——TabLayout、ViewPager、FragmentPagerAdapter的應用
-
底部菜單欄 切換——Fragment運用
-
主頁(顯示新聞列表)——ListView
-
設置(退出應用、退出登錄、清空緩存)——Activity管理、SharePreference
-
我的(賬號安全、新聞收藏夾)——SQLite
-
新聞列表下拉、上滑實現刷新——自定義ListView
-
逐條收藏新聞、刪除新聞——SharePreference
-
仿UI界面——各類控件運用
-
點擊查看新聞詳情 —— WebView
-
用戶界面更換頭像功能——Android運行時權限、多媒體、Content Provide
2、簡單說一下Activity生命周期?
下圖是Activity狀態(tài)轉換圖(注意圖中,方框內執(zhí)行的是狀態(tài)轉換的過程,并不是狀態(tài),狀態(tài)如前述,只有三種:RUNNING / PAUSED / STOPPED。)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vJsbyXJt-1691675604273)(//upload-images.jianshu.io/upload_images/24388310-a2e09c41ef074d05?imageMogr2/auto-orient/strip|imageView2/2/w/795)]
3、簡述一下RecyclerView緩存機制?
RecyclerView在Android的應用上可以說已經取代了listview,其靈活,組裝式設置,多緩存機制可以適應多列表在Android開發(fā)中各種各樣的需求。
對于RecyclerView的緩存機制一直都想稍微的屢下思路,簡單點說RecyclerView對比listview緩存機制中就是多了兩層緩存的支持,listview是兩級緩存,RecyclerView為四級緩存(當然在大部分情況下是三級緩存)。
4、在一個listview里每個item中都有一個動畫(gif)播放的view,當我點擊item中的button時動畫(gif)播放。當有動畫播放時滑動listview,偶爾會發(fā)生item錯位的事件。原因是什么?
這是item復用的問題,由于異步加載導致圖片錯位
5、當Activity有多個Handler的時候,Message消息是否會混亂?怎么樣區(qū)分當前消息由哪個Handler處理?
不會混亂,哪個Handler發(fā)送的消息,到時候也是這個handler處理。在發(fā)送消息的時候,會綁定target,這個target就是Handler本身,當需要handler調用dispatchMessage(msg)處理消息的時候,這個Handler就是發(fā)送消息時綁定的handler。
無論用哪一種方法發(fā)送消息,最終都會調用enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)來發(fā)送消息
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
這里的this,就是當前的handler。在來看需要Handler處理消息的時候,取的是哪一個handler,下面貼出主要源碼。
public static void loop() {
......
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
// This must be in a local variable, in case a UI event sets the logger
......
if (traceTag != 0 && Trace.isTagEnabled(traceTag)) {
Trace.traceBegin(traceTag, msg.target.getTraceName(msg));
}
final long dispatchStart = needStartTime ? SystemClock.uptimeMillis() : 0;
final long dispatchEnd;
try {
msg.target.dispatchMessage(msg);
dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
......
msg.recycleUnchecked();
}
}
這是循環(huán)消息時的部分代碼,處理消息代碼是msg.target.dispatchMessage(msg);,這里的target就是當時發(fā)送消息的handler。
二、B公司
1、介紹項目
剛剛說了,不多介紹
2、說一下你對Java中強引用、弱引用、軟引用的理解
強引用:這種引用就是我們在平常頻繁使用的引用類型,JVM默認的就是這種引用類型的,例如,A a = new A(),這種就是強引用;
在這種類型下,當內存空間不足的時候,JVM寧可會OOM,使得程序異常中止退出,也不會隨意的對其進行回收,只有當此對象沒有引用的時候,JVM才會回收他。
軟引用:這種引用我們可以這樣使用它,SoftReference sr = new SoftReference(new A());可以利用sr.get()獲取到這個對象,這種引用類型的對象,如果JVM內存足夠的話就不會回收他;如果JVM內存不足了,才會回收這些對象。這種引用類型適合用作緩存來使用。
弱引用:這種引用可以這用使用他,WeakReference wr = new WeakReference(new A());然后利用wr.get()獲取到這個對象;這種引用類型的對象,比軟引用的對象,擁有更加短暫的生命周期,在垃圾收集器掃描JVM的內存區(qū)域的時候,遇到此種引用類型的對象的時候,不管當前內存是否夠用,都會回收這些對象。
3、死鎖是什么?必要條件是什么?怎么避免?
-
死鎖是指多個進程循環(huán)等待它方占有的資源而無限期僵持下去的局面。當兩個或兩個以上的進程同時對多個互斥資源提出使用要求時,有可能導致死鎖。
-
互斥條件:即一次只有一個進程可以使用資源,其它進程不能訪問已經分配給其它進程的資源
-
占有且等待:一個進程等待其它進程釋放資源的時候,它已知占有這個資源
-
不可搶占:其它進程不能強行占用已經分配給進程的資源
-
循環(huán)等待:存在一個閉合鏈,鏈中的進程至少占據鏈中下一個進程的所需的一個資源
死鎖避免:
-
預防互斥:不可能禁止
-
預防占有且等待:讓進程一次性申請完所有的資源。
-
預防不可搶占:(1)當占有資源的進程進一步申請資源的時候,拒絕,然后強制釋放當前占用的資源。必要時可再申請。(2)當一個進程請求被另外一個進程所占據的資源的時候,操作系統(tǒng)可以搶占這個占據資源的進程。要求釋放資源。第二種方案只有在任意兩個進程優(yōu)先級不同的情況下.
-
預防循環(huán)等待:定義資源訪問線性序列
4、TCP與UDP的區(qū)別
-
基于連接與無連接。
-
TCP要求系統(tǒng)資源較多,UDP較少。
-
UDP程序結構較簡單。
-
流模式(TCP)與數據報模式(UDP)。
-
TCP保證數據正確性,UDP可能丟包。
**5、算法題:**給定一個非空字符串 s 和一個包含非空單詞列表的字典wordDict,判定 s 是否可以被空格拆分為一個或多個在字典中出現的單詞。
Android
1、自定義View需要重寫那些方法?
(結合實際需求,需要滑動則重寫onTouchEvent,需要控制自身布局則重寫onMeasure,onLayout)
2、如何進行布局優(yōu)化呢?
3、Handler消息機制
4、說說你對UI優(yōu)化的理解
三、C公司
1、介紹項目
剛剛說了,不多介紹
2、有沒有了解過插件化?插件化和組件化什么區(qū)別?
3、什么時候用Application的Context,什么時候用Activity的Context
4、一定要在主線程中更新UI嗎?能不能在子線程更新?
5、kotlin是如何兼容Java的?
復盤了這么多,其實細心的朋友可以發(fā)現,大廠面試對Java基礎、Android基礎還是比較看重的,所以在面試前,進行一波知識的梳理是很有必要的。
知識梳理完之后,也準備了不少的電子書和面試筆記等學習文檔,這些筆記將各個知識點進行了完美的總結(包含了很多內容:Android 基礎、Java 基礎、Android 源碼相關分析、常見的一些原理性問題等等):https://qr18.cn/CgxrRy
文章來源:http://www.zghlxwxcb.cn/news/detail-638958.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-638958.html
到了這里,關于Android 開發(fā)面試中,面試官最喜歡問那些問題?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!