面試難度還行,但是如果不好好複習,有幾個點還真是答不上來
第一部分
共享屏幕,在記事本里敲兩個編程題(還算容易的)
①一個整形數組,在原數組上修改,將奇數放在前面,偶數放在後面
/**
*思路:從數組兩端向中間查找,如果指針對應偶數-奇數,則相互對調,
*否則指針繼續前移
*/
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不再存在,應用程序也結束了運行.
共五種:
HOME_STACK_ID
Home應用以及recents app所在的棧FULLSCREEN_WORKSPACE_STACK_ID
一般應用所在的棧FREEFORM_WORKSPACE_STACK_ID
類似桌面操作系統DOCKED_STACK_ID
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大佬學習筆記
等等。