Android面試總結,有了這些中高階面試專題-大廠還會遠嗎?Android面試題及解析

程式設計師alvin發表於2020-12-19

大廠offer是每個技術人的追求?

我覺得每一個程式設計師的夢想大概就是能夠找一份大廠的 Offer,我覺得這很正常,這並不是我們的飯後談資而是每個技術人的追求。像阿里、騰訊、美團、位元組跳動、京東等等的技術氛圍與技術規範度還是要明顯優於一些創業型公司/小公司,如果說能夠在這樣的公司鍛鍊幾年,相信對自己能力的提升還是非常大的。但不是每個人都能夠進入大廠的,這往往取決於我們的能力、學歷、面試表現等因素。

現在面試大公司你說你沒有 Android Jetpack、協程、 Jetpack Compose 、Flutter 等理論等等已然大廠面試所必須的知識。但是,你真進入大廠了,可能幾年都用不上這些知識,還是老老實實去寫CRUD

面試官: 說一下垃圾回收機制吧

我: …可以通過強、弱引用計數結合方式解決引用計數的迴圈引用問題,實際上 Android 的智慧指標就是這樣實現的…

智慧指標

智慧指標在整個 Android 工程中使用很廣泛,在 binder 相關原始碼可以看到 sp、wp 型別的引用:

 sp<IBinder> result = new BpBinder(handle);

 wp<IBinder> result = new BpBinder(handle);

sp 即 strong pointer 強指標引用;wp 是 weak pointer 弱指標引用。

在 Java 中我們不用關心物件的銷燬及記憶體釋放,GC 機制會自動辨別回收無用物件,而 智慧指標 就是 native 層一個小型的 GC 實現。

智慧指標以引用計數的方式來標識無用物件,使用智慧指標的物件需繼承自 RefBase,RefBase 中維護了此物件的強引用數量和弱引用數量。

強指標 sp 過載了 “=” 運算子,在引用其他物件時將強引用計數 +1,在 sp 解構函式中將強引用計數 -1,當強引用計數減至 0 時銷燬引用的物件,這樣就實現了物件的自動釋放。

弱指標引用其他物件時將弱引用計數 +1,在 wp 解構函式中將弱引用計數 -1,當強引用計數為 0 時,不論弱引用計數是否為 0 都銷燬引用的物件。

如何解決迴圈引用問題

只靠強引用計數方式,會存在迴圈引用的問題,導致物件永遠無法被釋放,弱引用就是專門用來解決迴圈引用問題的:

若 A 強引用了 B,那 B 引用 A 時就需使用弱引用,當判斷是否為無用物件時僅考慮強引用計數是否為 0,不關心弱引用計數的數量

這樣就解決了迴圈引用導致物件無法釋放的問題,但這會引發野指標問題:當 B 要通過弱指標訪問 A 時,A 可能已經被銷燬了,那指向 A 的這個弱指標就變成野指標了。在這種情況下,就表示 A 確實已經不存在了,需要進行重新建立等其他操作

智慧指標自定義規則

智慧指標並不是固定的 “當強引用計數為 0 時,不論弱引用計數是否為 0 都銷燬引用的物件” ,而是可以自定義規則。RefBase 提供了 extendObjectLifetime() 方法,可以用來設定引用計數器的規則,不同規則對刪除目標物件的時機判斷也是不一樣的,包括以下三種規則:

  • OBJECT_LIFETIME_STRONG:只有在這個物件記憶體空間中的強計數器值為 0 的時候才會銷燬物件

  • OBJECT_LIFETIME_WEAK:只有在這個物件記憶體空間中的強計數器和弱計數器的值都為 0 的時候才會銷燬物件

  • OBJECT_LIFETIME_MASK:不管這兩個計數器是不是都為 0,都不銷燬物件,即與一般指標無異,還是要自己手動去釋放物件

最後

總而言之,Android開發行業變化太快,作為技術人員就要保持終生學習的態度,讓學習力成為核心競爭力,所謂“活到老學到老”只有不斷的學習,不斷的提升自己,才能跟緊行業的步伐,才能不被時代所淘汰。

在這裡我分享一份自己收錄整理上述技術體系圖相關的幾十套騰訊、頭條、阿里、美團等公司19年的面試題,把技術點整理成了視訊和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,這裡以圖片的形式給大家展示一部分。需要的朋友可以私信我【資料】或者 點這裡 免費領取

還有高階架構技術進階腦圖、Android開發面試專題資料,高階進階架構資料 幫助大家學習提升進階,也節省大家在網上搜尋資料的時間來學習,也可以分享給身邊好友一起學習。 領取地址: Android學習PDF+架構視訊+最新面試文件+原始碼筆記

%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

相關文章