面試官:我面Android程序員,常常遇到背題的,一問原理就露餡了

不說廢話,咱們直接進入正題,看看最近面試官都問了Android程序員哪些問題。程序員

1、Android10新特性及適配

新特性:面試

1) 摺疊屏
2) 5G網絡支持
3) 智能答覆通知
4) 暗黑模式
5) 手勢導航
6) 浮動設置面板
7) 分享改進編程

隱私瀏覽器

1) 前臺訪問權限
2) 網絡掃描須要精確位置權限
3) 防止設備跟蹤
4) 保護外部存儲中的用戶數據
5) 阻止不須要的中斷緩存

安全安全

1) 存儲加密
2) 默認TLS1.3
3) 平臺優化
4) 改進的生物識別服務器

相機和媒體網絡

1) 照片動態深度
2) 音頻播放捕獲
3) 新的音視頻編解碼器
4) 原生MIDI API
5) 定向可縮放的麥克風
6) 無處不在的Vulkan架構

鏈接優化併發

1) 改進的點對點和互聯網鏈接
2) WiFi高性能模式

Android系統基礎

1) ART優化
2) 神經網絡API1.2
3) 熱感API
4) 公共API的兼容性

更快的更新速度,更新鮮的代碼~

2、get 和 post 請求有哪些區別

  1. GET 請求的數據會附在 URL 以後(就是把數據放置在 HTTP 協議頭中),以?分割 URL 和傳輸數據,參數之間以&相連,如: login.action?name=zhagnsan&password=123456。POST 把提交的數據則放置在是 HTTP 包的包體中。
  2. GET 方式提交的數據最多隻能是 1024 字節,理論上 POST 沒有限制,可傳較大量的數據。其實這樣說是錯誤 的,不許確的:
    「GET 方式提交的數據最多隻能是 1024 字節",由於 GET 是經過 URL 提交數據,那麼 GET 可提交的數據量就跟 URL 的長度有直接關係了。而實際上,URL 不存在參數上限的問題,HTTP 協議規範沒有對 URL 長度進行限制。這個 限制是特定的瀏覽器及服務器對它的限制。IE 對 URL 長度的限制是 2083 字節(2K+35)。對於其餘瀏覽器,如 Netscape、 FireFox 等,理論上沒有長度限制,其限制取決於操做系統的支持。
  3. POST 的安全性要比 GET 的安全性高。注意: 這裏所說的安全性和上面 GET 提到的「安全」不是同個概念。上面「安全」的含義僅僅是不做數據修改,而這裏安全的含義是真正的 Security 的含義,好比: 經過 GET 提交數據,用 戶名和密碼將明文出如今 URL 上,由於(1)登陸頁面有可能被瀏覽器緩存,(2)其餘人查看瀏覽器的歷史紀錄,那麼別 人就能夠拿到你的帳號和密碼了,除此以外,使用 GET 提交數據還可能會形成 Cross-site request forgery 攻擊。

3、線程和進程的區別? 爲何不只僅用進程?

進程:

進程是具備獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度(若不支持線程機制,進程的系統調度的單位。不然,線程是系統調度的單位)的獨立單位。

特色:

1、進程是程序的一次執行過程。若程序執行兩次甚至屢次,則須要兩個甚至多個進程。

2、進程是正在運行程序的抽象。它表明運行的CPU,也稱進程是對CPU的抽象。

3、系統資源(如內存、文件)以進程爲單位分配。

4、操做系統爲每一個進程分配了獨立的地址空間。

5、操做系統經過「調度」把控制權交給進程。

進程的弊端:

1、進程切換的代價、開銷比較大。

2、在一個進程內也須要並行執行多個程序,實現不一樣的功能。

3、進程有時候性能比較低。(線程的引入爲了解決進程的弊端)。

線程:

1、有標識符ID。

2、有狀態及狀態轉換,因此須要提供一些狀態轉換操做。

3、不運行時須要保存上下文環境,因此須要程序計數器等寄存器。

4、有本身的棧和棧指針。

5、共享所在進程的地址空間和其它資源。

總結:

1、進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執行路徑。(進程能夠建立多個線程)。

2、在支持線程機制的系統中,進程是系統資源分配的單位,線程是CPU調度的單位。3、進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有本身的棧和棧指針,程序計數器等寄存器。

4、進程有本身獨立的地址空間,而線程沒有,線程必須依賴於進程而存在。

5、進程切換的開銷較大。線程相對較小。(前面也提到過,引入線程也出於了開銷的考慮)。

4、Java對象的生命週期

一、建立階段(Created):

在建立階段系統經過下面的幾個步驟來完成對象的建立過程;

1、爲對象分配存儲空間。

2、開始構造對象。

3、從超類到子類對static成員進行初始化。

4、超類成員變量按順序初始化,遞歸調用超類的構造方法。

5、子類成員變量按順序初始化,子類構造方法調用。一旦對象被建立,並被分派給某些變量賦值,這個對象的狀態就切換到了應用階段。

二、應用階段(In Use):

對象至少被一個強引用持有。

三、不可見階段(Invisible):

當一個對象處於不可見階段時,說明程序自己再也不持有該對象的任何強引用,雖然該這些引用仍然是存在着的。簡單說就是程序的執行已經超出了該對象的做用域了。

四、不可達階段(Unreachable):

對象處於不可達階段是指該對象再也不被任何強引用所持有。與「不可見階段」相比,「不可見階段」是指程序再也不持有該對象的任何強引用,這種狀況下,該對象仍可能被JVM等系統下的某些已裝載的靜態變量或線程或JNI等強引用持有着,這些特殊的強引用被稱爲」GC root」。存在着這些GCroot會致使對象的內存泄露狀況,沒法被回收。

五、收集階段(Collected):

當垃圾回收器發現該對象已經處於「不可達階段」而且垃圾回收器已經對該對象的內存空間從新分配作好準備時,則對象進入了「收集階段」。若是該對象已經重寫了finalize()方法,則會去執行該方法的終端操做。

這裏要特別說明一下:不要重載finazlie()方法!

緣由有兩點:

1、會影響JVM的對象分配與回收速度 在分配該對象時,JVM須要在垃圾回收器上註冊該對象,以便在回收時可以執行該重載方法;在該方法的執行時須要消耗CPU時間且在執行完該方法後纔會從新執行回收操做,即至少須要垃圾回收器對該對象執行兩次GC。

2、可能形成該對象的再次「復活」在finalize()方法中,若是有其它的強引用再次持有該對象,則會致使對象的狀態由「收集階段」又從新變爲「應用階段」。這個已經破壞了Java對象的生命週期進程,且「復活」的對象不利用後續的代碼管理。

六、終結階段:

當對象執行完finalize()方法後仍然處於不可達狀態時,則該對象進入終結階段。在該階段是等待垃圾回收器對該對象空間進行回收。

七、對象空間從新分配階段:

垃圾回收器對該對象的所佔用的內存空間進行回收或者再分配了,則該對象完全消失了,稱之爲「對象空間從新分配階段」。

5、爲何等待和通知是在 Object 類而不是 Thread 中聲明的

一個棘手的 Java 問題,若是 Java編程語言不是你設計的,你怎麼能回答這個問題呢?Java編程的常識和深刻了解有助於回答這種棘手的 Java 核心方面的面試問題。

爲何 wait,notify 和 notifyAll 是在 Object 類中定義的而不是在 Thread 類中定義
這是有名的 Java 面試問題,招2~4年經驗的到高級 Java 開發人員面試均可能碰到。

這個問題的好在它能反映了面試者對等待通知機制的瞭解,以及他對此主題的理解是否明確。就像爲何 Java 中不支持多繼承或者爲何 String 在 Java 中是 final 的問題同樣,這個問題也可能有多個答案。

爲何在 Object 類中定義 wait 和 notify 方法,每一個人都能說出一些理由。從個人面試經驗來看,wait 和 nofity 仍然是大多數Java 程序員最困惑的,特別是2到3年的開發人員,若是他們要求使用 wait 和 notify, 他們會很困惑。所以,若是你去參加 Java 面試,請確保對 wait 和 notify 機制有充分的瞭解,而且能夠輕鬆地使用 wait 來編寫代碼,並經過生產者-消費者問題或實現阻塞隊列等了解通知的機制。

爲何等待和通知須要從同步塊或方法中調用, 以及 Java 中的 wait,sleep 和 yield 方法之間的差別,若是你尚未讀過,你會以爲有趣。爲什麼 wait,notify 和 notifyAll 屬於 Object 類? 爲何它們不該該在 Thread 類中? 如下是我認爲有意義的一些想法:

  1. wait 和 notify 不只僅是普通方法或同步工具,更重要的是它們是 Java 中兩個線程之間的通訊機制。對語言設計者而言, 若是不能經過 Java 關鍵字(例如 synchronized)實現通訊此機制,同時又要確保這個機制對每一個對象可用, 那麼 Object 類則是的正確聲明位置。記住同步和等待通知是兩個不一樣的領域,不要把它們當作是相同的或相關的。同步是提供互斥並確保 Java 類的線程安全,而 wait 和 notify 是兩個線程之間的通訊機制。
  2. 每一個對象均可上鎖,這是在 Object 類而不是 Thread 類中聲明 wait 和 notify 的另外一個緣由。(你們平等)
  3. 在 Java 中爲了進入代碼的臨界區,線程須要鎖定並等待鎖定,他們不知道哪些線程持有鎖,而只是知道鎖被某個線程持有, 而且他們應該等待取得鎖, 而不是去了解哪一個線程在同步塊內,並請求它們釋放鎖定。
  4. Java 是基於 Hoare 的監視器的思想。在Java中,全部對象都有一個監視器。
    線程在監視器上等待,爲執行等待,咱們須要2個參數:
  5. 一個線程
  6. 一個監視器(任何對象)

在 Java 設計中,線程不能被指定,它老是運行當前代碼的線程。可是,咱們能夠指定監視器(這是咱們稱之爲等待的對象)。這是一個很好的設計,由於若是咱們可讓任何其餘線程在所需的監視器上等待,這將致使「入侵」,致使在設計併發程序時會遇到困難。請記住,在 Java 中,全部在另外一個線程的執行中侵入的操做都被棄用了(例如 stop 方法)。

Android學習PDF+架構視頻+面試文檔+源碼筆記


感謝你們能耐着性子看完囉裏囉嗦的文章,除了文章內的,我還有不少面試題的私藏。

在這裏我也分享出來,本身收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料幫助你們學習提高進階,也節省你們在網上搜索資料的時間來學習,也能夠分享給身邊好友一塊兒學習

若是你有須要的話,能夠點贊+評論關注我加Vx:15388039515(備註思否,須要資料)

相關文章
相關標籤/搜索