新鮮出爐的Android“麪筋”,夠刁鑽,面試複習不全面只能被懟了

面試難度還行,但是如果不好好複習,有幾個點還真是答不上來

第一部分

共享屏幕,在記事本里敲兩個編程題(還算容易的)

①一個整形數組,在原數組上修改,將奇數放在前面,偶數放在後面

/**
*思路:從數組兩端向中間查找,如果指針對應偶數-奇數,則相互對調,
*否則指針繼續前移
*/
public static void solution(int[] nums) {
    if (nums == null || nums.length <= 0) return;
    int left = 0, right = nums.length - 1;
    while (left < right) {
        //左邊是奇數,指針後移,直到發現偶數
        if (nums[left] % 2 != 0) {
            left++;
            continue;
        }
        //右邊是偶數,指針前移,直到發現奇數
        if (nums[right] % 2 == 0) {
            right--;
            continue;
        }
        //進行對換
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

② 判斷字符串是否是迴文字符串,例如abcba

/**
*兩端往中間進行遍歷,只要有一個字符不相等就返回false
*/
public static boolean isReversible(String s) {
    if (s == null || s.isEmpty())
        return false;
        
    int length = s.length();
    for (int i = 0; i < length / 2; i++) {
        if (s.charAt(i) != s.charAt(length - i - 1))
            return false;
    }
    return true;
}

第二部分

1.類加載機制,雙親委託

https://www.cnblogs.com/iteacat/p/12569008.html

2. Synchronized volatile關鍵字,volatile修飾基本數據類型和自定義類型區別,volatile底層實現

volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。

volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的

volatile僅能實現變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性

volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。

volatile標記的變量不會被編譯器優化(指令重排);synchronized標記的變量可以被編譯器優化

https://blog.csdn.net/u014674862/article/details/89168376

3. 四種引用類型

強引用:不會被回收

軟引用:內存不足時回收

弱引用:GC就會回收

虛引用:N/A

4. ContentProvider實現原理(如何跨進程)

getContentResolve->ApplicationContentResolver->ContentProviderProxy<===IBidner====>Transport->NameProvider

https://www.jianshu.com/p/147169640798

5. 發起一個https請求有哪些過程

  • 客戶端向服務器發起HTTPS的請求,連接到服務器的443端口;

  • 服務器將非對稱加密的公鑰傳遞給客戶端,以證書的形式回傳到客戶端

  • 服務器接受到該公鑰進行驗證,就是驗證2中證書,如果有問題,則HTTPS請求無法繼續;如果沒有問題,則上述公鑰是合格的。(第一次HTTP請求)客戶端這個時候隨機生成一個私鑰,成爲client key,客戶端私鑰,用於對稱加密數據的。使用前面的公鑰對client key進行非對稱加密;

  • 進行二次HTTP請求,將加密之後的client key傳遞給服務器;

  • 服務器使用私鑰進行解密,得到client key,使用client key對數據進行對稱加密

  • 將對稱加密的數據傳遞給客戶端,客戶端使用非對稱解密,得到服務器發送的數據,完成第二次HTTP請求。

這裏還問我證書是如何傳遞到客戶端的,有點懵,不知道是不是想問Android如何驗證證書

6. 有序廣播無序廣播區別,被攔截後超時機制

普通廣播:只要intentFilter的action匹配,則會接收此廣播

有序廣播:發送出去的廣播被廣播接收者按照按照Priority屬性值大小先後順序接收,先接受的receiver可以對廣播進行修改和截斷

這裏的超時是指,Android系統(AMS)向一個廣播接收器發送無序廣播時,
並不需要等待該廣播接收器返回結果,就會繼續向下一個廣播接收器發送廣播。但是,當Android系統發送有序廣播時,將會等待前一個廣播接收器返回結果後(除非處理超時), 纔會繼續發送向下一個廣播接收器發送廣播。

這個超時時間還真不知道

7. 進程優先級分類

前臺進程>可見進程>服務進程>後臺進程>空進程

8. AMS管理的棧有哪幾類

這裏的棧要區別與所說的Activity啓動模式的棧(task)

爲了讓這許多Activity協同工作而不至於產生混亂,Android平臺設計了ActivityStack機制用於管理Activity,其遵循先進後出的原則,系統總是顯示位於棧頂的Activity,從邏輯上將,位於棧頂的Activity也就是最後打開的Activity, 這也是符合邏輯的。
在操作應用程序時,每次啓動新的Activity,都會將此壓入Activity Stack,當用戶執行返回操作時,移除Activity Stack頂上的Activity,這樣就實現了返回上一個Activty的功能。直到用戶一直返回到Home Screen,這時候可以理解爲移除了Activity Stack所有的Activity,這個Activity Stack不再存在,應用程序也結束了運行.

共五種:

  1. HOME_STACK_ID
    Home應用以及recents app所在的棧

  2. FULLSCREEN_WORKSPACE_STACK_ID
    一般應用所在的棧

  3. FREEFORM_WORKSPACE_STACK_ID
    類似桌面操作系統

  4. DOCKED_STACK_ID

  5. PINNED_STACK_ID
    畫中畫棧

9. uid機制

uid: Android系統中uid用於標識一個應用程序,uid在應用安裝時被分配,並且在應用存在於手機上期間,都不會改變。一個應用程序只能有一個uid,多個應用可以使用sharedUserId 方式共享同一個uid,前提是這些應用的簽名要相同。

面試前做好準備戰!

接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!

這裏給大家提供一個方向,進行體系化的學習:

1、看視頻進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。

另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你。

2、進行系統梳理知識,提升儲備

客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

系統學習方向:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO

  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化

  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化

  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack

  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發

  • 微信小程序:小程序介紹+UI開發+API操作+微信對接

  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

3、讀源碼,看實戰筆記,學習大神思路

“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。

主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。

4、面試前夕,刷題衝刺

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

還有耗時一年多整理的一系列Android學習資源:Android源碼解析、Android第三方庫源碼筆記、Android進階架構師七大專題學習、歷年BAT面試題解析包、Android大佬學習筆記等等。

以上這些內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 【微信】 獲取。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章