Android 面試彙總<三>

1.3 計算機網絡html

  • 基礎

Q:五層協議的體系結構分別是什麼?每一層都有哪些協議?java

  • 技術點:網絡模型、協議
  • 思路:分條解釋每層名字以及協議
  • 參考回答:
    • 物理層
    • 數據鏈路層:邏輯鏈路控制LLC、媒體接入控制MAC
    • 網絡層:IP協議、地址解析協議ARP、逆地址解析協議RARP、因特網控制報文協議ICMP
    • 傳輸層:傳輸控制協議TCP、用戶數據報協議UDP
    • 應用層:文件傳輸協議FTP、遠程登陸協議TELNET、超文本傳輸協議HTTP、域名系統DNS、簡單郵件協議SMTP、簡單網絡管理協議SNMP

Q:爲什麼有MAC地址還要IP地址?git

  • 技術點:MAC地址、IP地址
  • 參考回答:
    • 每臺主機在出廠時都有一個惟一的MAC地址,可是IP地址的分配是根據網絡的拓樸結構,得以保證路由選擇方案創建在網絡所處的拓撲位置基礎而不是設備製造商的基礎上
    • 使用IP地址更方便數據傳輸。數據包在這些節點之間的移動都是由ARP協議負責將IP地址映射到MAC地址上來完成的。
  • TCP

Q:TCP和UDP的區別?面試

  • 技術點:傳輸層協議對比
  • 參考回答:
    • TCP傳輸控制協議:面向鏈接;使用全雙工的可靠信道;提供可靠的服務,即無差錯、不丟失、不重複且按序到達;擁塞控制、流量控制、超時重發、丟棄重複數據等等可靠性檢測手段;面向字節流;每條TCP鏈接只能是點到點的;用於傳輸可靠性要求高的數據
    • UDP用戶數據報協議:無鏈接;使用不可靠信道;盡最大努力交付,即不保證可靠交付;無擁塞控制等;面向報文;支持一對1、一對多、多對一和多對多的交互通訊;用於傳輸可靠性要求不高的數據

Q:擁塞控制和流量控制都是什麼,二者的區別?算法

  • 技術點:擁塞控制、流量控制
  • 參考回答:
    • 擁塞控制:對網絡中的路由和鏈路傳輸進行速度限制,避免網絡過載;包含四個過程:慢啓動、擁塞避免、快重傳和快恢復
    • 流量控制 :對點和點/發送方和接收方之間進行速度匹配,因爲接收方的應用程序讀取速度不必定很迅速,加上緩存有限,所以須要避免發送速度過快;相關技術:TCP滑動窗口、回退N針協議

Q:談談TCP爲何要三次握手?爲何要四次揮手?數據庫

  • 技術點:TCP可靠保證
  • 參考回答:
  • (1)創建TCP鏈接:TCP的三次握手編程


    • 客戶端向服務端發送一個表示創建鏈接的報文段SYN報文段;一旦包含SYN報文段的IP數據報到達服務器主機,服務器從IP數據報中提取出TCP、SYN報文段,爲該TCP鏈接分配須要的緩存和變量,並向客戶端發送表示容許鏈接的報文段ACK;在收到ACK報文段以後,客戶端也要給該鏈接分配緩存和變量,客戶端向服務器再發送一個報文段ACK,表示對容許鏈接的報文段進行了確認。自此完成一次TCP鏈接。
    • 第三次握手能夠避免因爲客戶端延遲的請求鏈接的請求,使得服務端無端再次創建鏈接。
  • (2)斷開TCP鏈接:TCP的四次揮手設計模式


    • 因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨關閉。客戶端在數據發送完畢後發送一個結束數據段FIN,且服務端也返回確認數據段ACK,此時結束了客戶端到服務端的鏈接;而後客戶端接收到服務端發送的FIN,且服務端也收到了ACK以後,自此雙方的數據通訊徹底結束。簡單說來是 「先關讀,後關寫」,一共須要四個階段:服務器讀通道關閉->客戶機寫通道關閉->客戶機讀通道關閉->服務器寫通道關閉。
  • 引伸:談談客戶端到達的TIME_WAIT狀態時間是MaximumSegmentLifetime的兩倍,而不是直接進入CLOSED狀態的緣由。(保證TCP協議的全雙工鏈接可以可靠關閉、保證本次鏈接的重複數據段從網絡中消失)

Q:播放視頻用TCP仍是UDP?爲何?數組

  • 技術點:傳輸層協議適用場景
  • 參考回答:播放視頻適合用UDP。UDP適用於對網絡通信質量要求不高、要求網絡通信速度能儘可能快的實時性應用;而TCP適用於對網絡通信質量有要求的可靠性應用。並且視頻區分關鍵幀和普通幀,雖然UDP會丟幀但若是隻是丟普通幀損失並不大,取而代之的是高速率和實時性。
  • 引伸:TCP、UDP適用的場景
  • HTTP

Q:瞭解哪些響應狀態碼?瀏覽器

  • 技術點:響應狀態碼
  • 思路:
  • 參考回答:狀態碼由三位數字組成,第一位數字表示響應的類型,經常使用的狀態碼有五大類:
    • 1xx:表示服務器已接收了客戶端請求,客戶端可繼續發送請求
    • 2xx:表示服務器已成功接收到請求並進行處理
      • 200 OK:表示客戶端請求成功
    • 3xx:表示服務器要求客戶端重定向
    • 4xx:表示客戶端的請求有非法內容
      • 400 Bad Request:表示客戶端請求有語法錯誤,不能被服務器所理解
      • 401 Unauthonzed:表示請求未經受權,該狀態代碼必須與 WWW-Authenticate 報頭域一塊兒使用
      • 403 Forbidden:表示服務器收到請求,可是拒絕提供服務,一般會在響應正文中給出不提供服務的緣由
      • 404 Not Found:請求的資源不存在,例如,輸入了錯誤的URL
    • 5xx:表示服務器未能正常處理客戶端的請求而出現意外錯誤
      • 500 Internal Server Error:表示服務器發生不可預期的錯誤,致使沒法完成客戶端的請求
      • 503 Service Unavailable:表示服務器當前不可以處理客戶端的請求,在一段時間以後,服務器可能會恢復正常

Q:get和post的區別?

  • 技術點:HTTP請求方法
  • 參考回答:
    • GET:當客戶端要從服務器中讀取某個資源時使用GET;通常用於獲取/查詢資源信息;GET參數經過URL傳遞,傳遞的參數是有長度限制,不能用來傳遞敏感信息
    • POST:當客戶端給服務器提供信息較多時可使用POST;POST會附帶用戶數據,通常用於更新資源信息;POST將請求參數封裝在HTTP 請求數據中,能夠傳輸大量數據,傳參方式比GET更安全

Q:HTTP1.0、HTTP1.一、HTTP2.0的區別?

  • 技術點:HTTP協議發展
  • 參考回答:
  • (1)HTTP1.0和HTTP1.1的區別:
    • HTTP1.0默認使用短鏈接,HTTP1.1開始默認使用長鏈接
    • HTTP1.1增長更多的請求頭和響應頭來改進和擴充HTTP1.0的功能,好比身份認證、狀態管理和Cache緩存等
  • (2)HTTP2.0和HTTP1.X相比的新特性:
    • 新的二進制格式:HTTP2.0的協議解析決定採用二進制格式,實現方便且健壯,不一樣於HTTP1.x的解析是基於文本
    • 多路複用:鏈接共享,即每個request都是是用做鏈接共享機制的
    • 服務端推送:服務器主動向客戶端推送消息
  • 引伸:長鏈接和短鏈接的優缺點和適用場景,HTTP 長鏈接和短鏈接

Q:HTTP和TCP的區別

  • 技術點:HTTP、TCP
  • 參考回答:
    • TCP是傳輸層協議,定義數據傳輸和鏈接方式的規範。經過三次握手創建鏈接、四次揮手釋放鏈接。
    • HTTP是應用層協議,定義的是傳輸數據的內容的規範。HTTP的鏈接使用"請求-響應"方式。基於TCP協議傳輸,默認端口號是80。

Q:HTTP和HTTPS的區別

  • 技術點:HTTP、HTTPS
    • HTTP(超文本傳輸協議):運行在TCP之上;傳輸的內容是明文;端口是80
    • HTTPS(安全爲目標的HTTP):運行在SSL/TLS之上,SSL/TLS運行在TCP之上;傳輸的內容通過加密;端口是443

Q:HTTP和Socket的區別-

  • 技術點:HTTP、Socket
  • 參考回答:
    • HTTP是應用層協議;基於TCP協議;使用「請求—響應」方式創建鏈接,在請求時須要先創建鏈接且客戶端要先發出請求,可見服務器須要等到客戶端發送一次請求後才能將數據傳回給客戶端
    • Socket(套接字)是對TCP/IP協議的封裝,是接口而不是協議;建立Socket鏈接時能夠指定傳輸層協議TCP或UDP;Socket創建鏈接過程三步驟:服務器監聽->客戶端請求->鏈接確認,可見服務器能夠直接將數據傳送給客戶端(HTTP2.0也增長了服務端推送的功能)

Q:在地址欄打入URL會發生什麼?

  • 技術點:理解網絡模型
  • 參考回答:在瀏覽器地址欄鍵入URL,按下回車以後會經歷如下流程:
    • 瀏覽器向DNS服務器請求解析該URL中的域名所對應的IP地址
    • 解析出IP地址後,根據該IP地址和默認端口80,和服務器創建TCP鏈接
    • 瀏覽器發出讀取文件的HTTP請求,該請求報文做爲TCP三次握手的第三個報文的數據發送給服務器
    • 服務器對瀏覽器請求做出響應,並把對應的html文本發送給瀏覽器
    • 釋放TCP鏈接,若connection模式爲close,則服務器主動關閉TCP鏈接,客戶端被動關閉鏈接,釋放TCP鏈接;若connection模式爲keepalive,則該鏈接會保持一段時間,在該時間內能夠繼續接收請求
    • 客戶端將服務器響應的html文本解析並顯示

1.4 JVM

Q:JVM內存是如何劃分的?

  • 技術點:JVM內存管理
  • 思路:分條解釋每部份內存的做用,詳見要點提煉| 理解JVM以內存管理
  • 參考回答:JVM會用一段空間來存儲執行程序期間須要用到的數據和相關信息,這段空間就是運行時數據區(Runtime Data Area),也就是常說的JVM內存。JVM會將它所管理的內存劃分爲線程私有數據區線程共享數據區兩大類:
    • 線程私有數據區包含:
      • 程序計數器:是當前線程所執行的字節碼的行號指示器
      • 虛擬機棧:是Java方法執行的內存模型
      • 本地方法棧:是虛擬機使用到的Native方法服務
    • 線程共享數據區包含:
      • Java堆:用於存放幾乎全部的對象實例和數組;是垃圾收集器管理的主要區域,也被稱作「GC堆」;是Java虛擬機所管理的內存中最大的一塊
      • 方法區:用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據;Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後進入方法區的運行時常量池中存放
  • 引伸:談談JVM的堆和棧差異

Q:談談垃圾回收機制?爲何引用計數器斷定對象是否回收不可行?知道哪些垃圾回收算法?

  • 技術點:垃圾回收機制
  • 思路:從如何斷定對象可回收、若是回收具體算法這兩方面展開談垃圾回收機制,詳見要點提煉| 理解JVM之GC
  • 參考回答:
  • (1)斷定對象可回收有兩種方法:
    • 引用計數算法:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任什麼時候刻計數器爲0的對象就是不可能再被使用的。然而在主流的Java虛擬機裏未選用引用計數算法來管理內存,主要緣由是它難以解決對象之間相互循環引用的問題,因此出現了另外一種對象存活斷定算法。
    • 可達性分析法:經過一系列被稱爲『GC Roots』的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證實此對象是不可用的。其中可做爲GC Roots的對象:虛擬機棧中引用的對象,主要是指棧幀中的本地變量、本地方法棧中Native方法引用的對象、方法區中類靜態屬性引用的對象、方法區中常量引用的對象
  • (2)回收算法有如下四種:
    • 分代收集算法:是當前商業虛擬機都採用的一種算法,根據對象存活週期的不一樣,將Java堆劃分爲新生代和老年代,並根據各個年代的特色採用最適當的收集算法。
      • 新生代:大批對象死去,只有少許存活。使用『複製算法』,只需複製少許存活對象便可。
        • 複製算法:把可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用盡後,把還存活着的對象『複製』到另一塊上面,再將這一塊內存空間一次清理掉。
      • 老年代:對象存活率高。使用『標記—清理算法』或者『標記—整理算法』,只需標記較少的回收對象便可。
        • 標記-清除算法:首先『標記』出全部須要回收的對象,而後統一『清除』全部被標記的對象。
        • 標記-整理算法:首先『標記』出全部須要回收的對象,而後進行『整理』,使得存活的對象都向一端移動,最後直接清理掉端邊界之外的內存。
  • 引伸:談談每種回收算法的優缺點

Q:Java中引用有幾種類型?在Android中經常使用於什麼情景?

  • 技術點:Java引用類型
  • 思路:分條解釋每種類型的特色和適用場景,詳見要點提煉| 理解JVM之GC
  • 參考回答:引用的四種類型
    • 強引用(StrongReference):具備強引用的對象不會被GC;即使內存空間不足,JVM寧願拋出OutOfMemoryError使程序異常終止,也不會隨意回收具備強引用的對象。
    • 軟引用(SoftReference):只具備軟引用的對象,會在內存空間不足的時候被GC;軟引用經常使用來實現內存敏感的高速緩存
    • 弱引用(WeakReference):只被弱引用關聯的對象,不管當前內存是否足夠都會被GC;強度比軟引用更弱,經常使用於描述非必需對象;經常使用於解決內存泄漏的問題
    • 虛引用(PhantomReference):僅持有虛引用的對象,在任什麼時候候均可能被GC;經常使用於跟蹤對象被GC回收的活動;必須和引用隊列 (ReferenceQueue)聯合使用,當垃圾回收器準備回收一個對象時,若是發現它還有虛引用,就會在回收對象的內存以前,把這個虛引用加入到與之關聯的引用隊列中。

Q:類加載的全過程是怎樣的?什麼是雙親委派模型?

  • 技術點:類加載機制、雙親委派模型
  • 思路:類加載機制的含義以及每一個階段的做用,在解釋雙親委派模型以前須要先理解類加載器,詳見要點提煉| 理解JVM之類加載機制
  • 參考回答:
  • (1)類加載機制:是虛擬機把描述類的數據從Class文件加載到內存,並對數據進行校驗轉換解析初始化,最終造成可被虛擬機直接使用的Java類型的過程。另外,類型的加載、鏈接和初始化過程都是在程序運行期完成的,從而經過犧牲一些性能開銷來換取Java程序的高度靈活性。下面介紹類加載每一個階段的任務:
    • 加載(Loading):經過類的全限定名來獲取定義此類的二進制字節流;將該二進制字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構,該數據存儲數據結構由虛擬機實現自行定義;在內存中生成一個表明這個類的java.lang.Class對象,它將做爲程序訪問方法區中的這些類型數據的外部接口
    • 驗證(Verification):確保Class文件的字節流中包含的信息符合當前虛擬機的要求,包括文件格式驗證、元數據驗證、字節碼驗證和符號引用驗證
    • 準備(Preparation):爲類變量分配內存,由於這裏的變量是由方法區分配內存的,因此僅包括類變量而不包括實例變量,後者將會在對象實例化時隨着對象一塊兒分配在Java堆中;設置類變量初始值,一般狀況下零值
    • 解析(Resolution):虛擬機將常量池內的符號引用替換爲直接引用的過程
    • 初始化(Initialization):是類加載過程的最後一步,會開始真正執行類中定義的Java字節碼。而以前的類加載過程當中,除了在『加載』階段用戶應用程序可經過自定義類加載器參與以外,其他階段均由虛擬機主導和控制
  • (2)類加載器:不只用於加載類,還和這個類自己一塊兒做爲在JVM中的惟一標識。常見類加載器類型有:
    • 啓動類加載器:是虛擬機自身的一部分
    • 擴展類加載器、應用程序類加載器、自定義類加載器:獨立於虛擬機外部
  • (3)雙親委派模型:表示類加載器之間的層次關係。
    • 前提:除了頂層啓動類加載器外,其他類加載器都應當有本身的父類加載器,且它們之間關係通常不會以繼承(Inheritance)關係來實現,而是經過組合(Composition)關係來複用父加載器的代碼。
    • 工做過程:若一個類加載器收到了類加載的請求,它先會把這個請求委派給父類加載器,並向上傳遞,最終請求都傳送到頂層的啓動類加載器中。只有當父加載器反饋本身沒法完成這個加載請求時,子加載器纔會嘗試本身去加載。

Q:工做內存和主內存的關係?在Java內存模型有哪些能夠保證併發過程的原子性、可見性和有序性的措施?

  • 技術點:JVM內存模型、線程安全
  • 思路:理解Java內存模型的結構、詳見要點提煉| 理解JVM以內存模型&線程
  • 參考回答:Java內存模型就是經過定義程序中各個變量訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。
    • 模型結構如圖:

      其中 ,主內存(Main Memory)是全部變量的存儲位置,每條線程還有本身的工做內存,用於保存被該線程使用到的變量的主內存副本拷貝。爲了獲取更好的運行速度,虛擬機可能會讓工做內存優先存儲於寄存器和高速緩存中。
    • 保證併發過程的原子性、可見性和有序性的措施:
      • 原子性(Atomicity):一個操做要麼都執行要麼都不執行。
        • 可直接保證的原子性變量操做有:readloadassignusestorewrite,所以可認爲基本數據類型的訪問讀寫是具有原子性的。
        • 若須要保證更大範圍的原子性,可經過更高層次的字節碼指令monitorentermonitorexit來隱式地使用lockunlock這兩個操做,反映到Java代碼中就是同步代碼塊synchronized關鍵字。
      • 可見性(Visibility):當一個線程修改了共享變量的值,其餘線程可以當即得知這個修改。
        • 經過在變量修改後將新值同步回主內存,在變量讀取前從主內存刷新變量值這種依賴主內存做爲傳遞媒介的方式來實現。
        • 提供三個關鍵字保證可見性:volatile能保證新值能當即同步到主內存,且每次使用前當即從主內存刷新;synchronized對一個變量執行unlock操做以前能夠先把此變量同步回主內存中;被final修飾的字段在構造器中一旦初始化完成且構造器沒有把this的引用傳遞出去,就能夠在其餘線程中就能看見final字段的值。
      • 有序性(Ordering):程序代碼按照指令順序執行。
        • 若是在本線程內觀察,全部的操做都是有序的,指「線程內表現爲串行的語義」;若是在一個線程中觀察另外一個線程,全部的操做都是無序的,指「指令重排序」現象和「工做內存與主內存同步延遲」現象。
        • 提供兩個關鍵字保證有序性:volatile 自己就包含了禁止指令重排序的語義;synchronized保證一個變量在同一個時刻只容許一條線程對其進行lock操做,使得持有同一個鎖的兩個同步塊只能串行地進入。

Q:JVM、Dalvik、ART的區別?

  • 技術點:虛擬機對比
  • 思路:分別談談JVM和Dalvik、Dalvik和ART的區別,詳見Jvm、Dalvik和Art的區別
  • 參考回答:
    • Dalvik :是Google公司本身設計用於Android平臺的Java虛擬機,不是Java虛擬機,沒有遵循Java虛擬機規範,具體區別以下圖:
    • ART:代替Dalvik,應用無需每次運行都要先編譯,而是在安裝時就預編譯字節碼到機器語言,提高運行時效率;預先編譯也使得ART佔用空間比Dalvik大,即用空間換時間;因爲減小運行時重複編譯,可明顯改善電池續航,下降了能耗。

Q:Java中堆和棧的區別?

  • 技術點:內存管理
  • 思路:從存放數據和內存回收角度出發
  • 參考回答: 在java中,堆和棧都是內存中存放數據的地方,具題區別是:
    • 棧內存:主要用來存放基本數據類型局部變量;當在代碼塊定義一個變量時會在棧中爲這個變量分配內存空間,當超過變量的做用域後這塊空間就會被自動釋放掉。
    • 堆內存:用來存放運行時建立的對象,好比經過new關鍵字建立出來的對象和數組;須要由Java虛擬機的自動垃圾回收器來管理。

1.5 操做系統

Q:操做系統中進程和線程的區別?

  • 技術點:進程、線程
  • 參考回答:
    • 進程是操做系統分配和管理資源的單位,線程是CPU調度和管理的單位,是CPU調度的最小單元
    • 進程擁有獨立的地址空間,而線程間共享地址空間
    • 進程建立的開銷比較大,線程建立的開銷小
  • 引伸:可談談安卓系統中對進程和線程的理解

Q:進程死鎖的產生和避免?

  • 技術點:死鎖
  • 思路:可從死鎖含義、產生條件、解決辦法、避免手段出發
  • 參考回答:死鎖是指多個進程因循環等待資源而形成沒法執行的現象,它會形成進程沒法執行,同時會形成系統資源的極大浪費。
    • 死鎖產生的條件:
      • 互斥使用:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。若是此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
      • 不可搶佔:指進程已得到的資源,在未使用完以前,不能被剝奪,只能在使用完時由本身釋放。
      • 請求和保持:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對本身已得到的其它資源保持不放。
      • 循環等待:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
    • 解決死鎖的策略:
      • 銀行家算法:判斷這次請求是否形成死鎖若會形成死鎖,不然拒絕該請求
      • 鴕鳥算法:忽略該問題,經常使用於在極少發生死鎖的的狀況
    • 死鎖的避免:經過合理的資源分配算法來確保永遠不會造成環形等待的封閉進程鏈,即「若是一個進程的當前請求的資源會致使死鎖,系統拒絕啓動該進程;若是一個資源的分配會致使下一步的死鎖,系統就拒絕本次的分配」

1.6 數據結構&算法

Q:怎麼理解數據結構?
Q:什麼是斐波那契數列?
Q:迭代和遞歸的特色,並比較優缺點
Q:瞭解哪些查找算法,時間複雜度都是多少?
Q:瞭解哪些排序算法,並比較一下,以及適用場景
Q:快排的基本思路是什麼?最差的時間複雜度是多少?如何優化?
Q:AVL樹插入或刪除一個節點的過程是怎樣的?
Q:什麼是紅黑樹?
Q:100盞燈問題
Q:老鼠和毒藥問題,加個條件,必需要求次日出結果
Q:海量數據問題
Q:(手寫算法)二分查找
Q:(手寫算法)反轉鏈表
Q:(手寫算法)用兩個棧實現隊列
Q:(手寫算法)多線程輪流打印問題
Q:(手寫算法)如何判斷一個鏈有環/兩條鏈交叉
Q:(手寫算法)快速從一組無序數中找到第k大的數/前k個大的數
Q:(手寫算法)最長(不)重複子串

  • 技術點:數據結構、手寫算法
  • 思路:篇幅問題,該部分將單獨作一篇總結

1.7 設計模式

Q:談談MVC、MVP和MVVM,好在哪裏,很差在哪裏?

  • 技術點:MVC、MVP、MVVM
  • 思路:詳見MVP、MVVM模式
  • 參考回答:
    • MVP的含義:
      • Model:數據層,負責存儲、檢索、操縱數據。
      • View:UI層,顯示數據,並向Presenter報告用戶行爲。
      • Presenter:做爲View與Model交互的中間紐帶,從Model拿數據,應用到UI層,管理UI的狀態,響應用戶的行爲。
    • MVP相比於MVC的優點
      • 分離了視圖邏輯和業務邏輯,下降了耦合。
      • Activity只處理生命週期的任務,代碼變得更加簡潔
      • 視圖邏輯和業務邏輯分別抽象到了View和Presenter的接口中去,提升代碼的可閱讀性。
      • Presenter被抽象成接口,能夠有多種具體的實現,因此方便進行單元測試
      • 把業務邏輯抽到Presenter中去,避免後臺線程引用着Activity致使Activity的資源沒法被系統回收從而引發內存泄露和OOM。
    • MVVM的含義:與MVP相似,利用數據綁定(Data Binding)、依賴屬性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一個更加靈活高效的架構。
    • MVVM相比於MVP的優點:在常規的開發模式中,數據變化須要更新UI的時候,須要先獲取UI控件的引用,而後再更新UI,獲取用戶的輸入和操做也須要經過UI控件的引用,但在MVVM中,這些都是經過數據驅動來自動完成的,數據變化後會自動更新UI,UI的改變也能自動反饋到數據層,數據成爲主導因素。這樣MVVM層在業務邏輯處理中只要關心數據,不須要直接和UI打交道,在業務處理過程當中簡單方便不少。

Q:如何理解生產者消費者模型?

  • 技術點:生產者消費者模型
  • 參考回答:生產者消費者模型經過一個緩存隊列,既解決了生產者和消費者之間強耦合的問題,又平衡了生產者和消費者的處理能力。
    • 具體規則:生產者只在緩存區未滿時進行生產,緩存區滿時生產者進程被阻塞;消費者只在緩存區非空時進行消費,緩存區爲空時消費者進程被阻塞;當消費者發現緩存區爲空時會通知生產者生產;當生產者發現緩存區滿時會通知消費者消費。
    • 實現關鍵:synchronized保證對象只能被一個線程佔用;wait()讓當前線程進入等待狀態,並釋放它所持有的鎖;notify()&notifyAll()喚醒一個(全部)正處於等待狀態的線程

Q:是否能從Android中舉幾個例子說說用到了什麼設計模式?

  • 技術點:設計模式
  • 參考回答:
    • View事件分發:責任鏈模式
    • BitmapFactory加載圖片:工廠模式
    • Adapter:適配器模式
    • Builder:建造者模式
    • Adpter.notifyDataSetChanged():觀察者模式
    • Binder機制:代理模式

Q:裝飾模式和代理模式有哪些區別?

  • 技術點:裝飾模式、代理模式
  • 參考回答:
    • 使用目的不一樣:代理模式是給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用;裝飾模式是在沒必要改變原類文件和使用繼承的狀況下,動態地擴展一個對象的功能
    • 構造不一樣:代理模式內部保持對目標對象的引用;裝飾模式是經過構造函數傳參的方式獲得目標對象

Q:實現單例模式有幾種方法?懶漢式中雙層鎖的目的是什麼?兩次判空的目的又是什麼?

  • 技術點:單例模式
  • 參考回答:實現單例模式常見的兩種方式:
    (1)懶漢式:延遲加載,同時也要保證多線程環境下會產生多個single對象
public class Singleton { private Singleton() {} pprivate volatile static Singleton instance;//第一層鎖:保證變量可見性 public static Singleton getInstance() { if (single == null) {//第一次判空:無需每次都加鎖,提升性能 synchronized (Singleton.class) {//第二層鎖:保證線程同步 if (single == null) {//第二次判空:避免多線程同時執行getInstance()產生多個single對象 single = new Singleton(); } } } return single; } } 

(2)餓漢式:在類加載初始化時就建立好一個靜態的對象供外部使用

public class Singleton { private Singleton() {} private static Singleton single = new Singleton(); public static Singleton getInstance() { return single; } } 

Q:談談了解的設計模式原則?

  • 技術點:設計模式原則
  • 參考回答:
    • 單一職責原則:一個類只負責一個功能領域中的相應職責
    • 開放封閉原則:對擴展開放,對修改關閉
    • 依賴倒置原則:抽象不該該依賴於細節,細節應當依賴於抽象。換言之,要針對接口編程,而不是針對實現編程
    • 迪米特法則:應該儘可能減小對象之間的交互,若是兩個對象之間沒必要彼此直接通訊,那麼這兩個對象就不該當發生任何直接的相互做用,若是其中的一個對象須要調用另外一個對象的某一個方法的話,能夠經過第三者轉發這個調用
    • 合成/聚合複用原則:要儘可能使用合成/聚合,儘可能不要使用繼承

1.8 數據庫

Q:數據庫中的事務瞭解嗎?事務的四大特性?

  • 技術點:事務
  • 參考回答:
    • 事務是併發控制的單位,是用戶定義的一個操做序列。它指這些操做要麼都作,要麼都不作,以便服務器保持數據的完整性。
    • 事務一般是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。
    • 事務的四大特性(ACID特性):原子性(Atomicity)表示事務中包括的諸操做要麼全作,要麼全不作;一致性(Consistency)表示事務執行的結果必須是使數據庫從一個一致性狀態變到另外一個一致性狀態;隔離性(Isolation)表示一個事務的執行不能被其餘事務干擾;持續性(Durability)表示一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的
  • 引伸:談談數據庫事務的併發控制

Q:如何理解數據庫的範式?

  • 技術點:範式
  • 思路:詳見實例講解數據庫的3大範式和5大約束
  • 參考回答:
    • 第一範式(1NF):數據表中的每一個字段必須是不可拆分的最小單元,即確保每一列的原子性
    • 第二範式(2NF):知足1NF後,要求表中的全部列,都必須依賴於主鍵,而不能有任何一列與主鍵沒有關係
    • 第三範式(3NF):必須先知足第二範式,要求表中的每一列只與主鍵直接相關而不是間接相關,即表中的每一列只能依賴於主鍵

1.9 hr問題

Q:請簡單的自我介紹一下

  • 可能意圖:開場白;短時間內快速瞭解候選人狀況;考察表達能力和邏輯思惟;是否有備而來;第一印象
  • 思路:說亮點、語言精煉、熟練回答

Q:談談項目經歷,爲何會作,怎麼作的,遇到的難點?
Q:談談實習經歷,作了什麼,收穫有哪些?
Q:談談學習Android的經歷,有哪些學習方法和技巧?
Q:成績怎麼樣?獎學金狀況?
Q:學過哪些課程?那門課印象最深入/最有意義/學的最好/最不喜歡?爲何?
Q:學習生活中遇到什麼挫折,如何解決的?
Q:家是哪裏的?是獨生子女嗎?從小的家庭環境如何?
Q:日常有哪些興趣愛好?大學參加了哪些校園活動?
Q:評價一下本身的優缺點?/用x個詞形容你本身。/別人都是怎樣評價你的?
Q:以爲本身博客寫的最好的文章是什麼?爲何?
Q:以爲本身的優點是什麼?

  • 可能意圖:瞭解候選人的性格、各方面特質,是否符合企業價值觀;瞭解其溝通表達能力、學習能力等才能,是否具備可塑性
  • 思路:結合具體實例體現本身確是企業想要的人才

Q:是否會考研?/爲什麼不保研?
Q:近x年的職業規劃?
Q:爲何想來咱們公司?/爲什麼不轉正留在xx?
Q:對公司/部門是否有了解?
Q:爲什麼會選擇作技術?/對女生作開發的見解?
Q:還投過那些公司,進展如何?若是xx和xx都給你發offer會如何選擇?
Q:有男/女友嗎?將來有什麼規劃?
Q:如何看待加班?
Q:意向工做城市是哪?/是否會考慮在xx發展?
Q:對於薪酬有什麼想法?

  • 可能意圖:瞭解候選人對企業的意向度和忠誠度,是否值得給發offer
  • 思路:表現出想去該公司的態度、並已爲之作了準備

Q:有什麼問題想要問我?

  • 可能意圖:結束語;主動權交由候選人
  • 思路:諮詢和崗位&部門&公司發展相關的狀況、探討對某技術的見解、詢問面試官對你的評價、尋求學習等方面的建議、瞭解後續面試流程和進度;注意,避免問薪資和加班問題、也不要直接說「沒有問題」

1.10 項目相關、實習相關技術問題(略)

Q:使用那些版本控制工具?Git和SVN的區別?

  • 技術點:版本控制工具
  • 參考回答:Git和SVN的區別有如下幾點:
    • Git是分佈式的,而SVN是集中式的(核心區別)
    • Git按元數據方式存儲內容,而SVN按文件存儲內容
    • 在Git上每一個工做成員能夠任意在本身的本地版本庫開啓無限個分支且互不影響,而對於SVN分支是一個完整的目錄且這個目錄擁有完整的實際文件
    • Git沒有一個全局的版本號,而SVN有
    • Git 的內容完整性要優於SVN
    • 在Git中的絕大多數操做都只須要訪問本地文件和資源,沒必要聯網就能夠看到全部的歷史版本記錄,而SVN 卻須要聯網
  • 引伸:談談兩種版本控制工具的優缺點:SVN與GIT的優缺點對比

Q:瞭解Git工具嗎?用過哪些命令?解決衝突時git merge和git rebase的區別?

  • 技術點:版本控制工具Git
  • 思路:經過圖記憶Git經常使用命令,詳見Git、GitHub、Stash
  • 參考回答: 經常使用命令見圖,源自一篇文章,教你學會Git
    合併用到的命令git merge與git rebase的區別是,git merge會生成一個新的節點,並將以前的提交分開顯示;git rebase操做不會生成新的節點,而是將兩個分支融合成一個線性的提交。
知識來源:minmin_1123 連接:https://www.jianshu.com/p/168e52336b53
相關文章
相關標籤/搜索