金9銀10,分享幾個重要的Android面試題

來源:互聯網
上載者:User

標籤:讀取   索引值對   dde   對象   方便   演算法   http   malloc   bee   

說一下java多態的理解,以及接繼承,和介面的理解

於哥在這裡只講多態,其他自己上網體會

對於多態的定義
不同類的對象對統一函數做出不同對的響應或者動作。
作用
主要是消除類之間的耦合性,靈活性比較強,利於代碼的編寫和修改。尤其在處理大量的運算和操作時,可以靈活地簡化,替換或者是修改代碼!

三個必要條件
1、一個凳子(繼承extends)
2、重寫
3、父類引用指向子類對象

for example


 
 
 

 


 
 

 


 

 

測試結果:


測試結果

 

oKhttp的 原理

1.同步和非同步:

  • 1.非同步使用了Dispatcher來將儲存在 Deque 中的請求指派給線程池中各個線程執行。
  • 2.當任務執行完成後,無論是否有異常,finally程式碼片段總會被執行,也就是會調用Dispatcher的finished函數,它將正在啟動並執行任務Call從隊列runningAsyncCalls中移除後,主動的把緩衝隊列向前走了一步。

2.串連池:

  • 1.一個Connection封裝了一個socket,ConnectionPool中儲存s著所有的Connection,StreamAllocation是引用計數的一個單位
  • 2.當一個請求擷取一個Connection的時候要傳入一個StreamAllocation,Connection中存著一個弱引用的StreamAllocation列表,每當上層應用引用一次Connection,StreamAllocation就會加一個。反之如果上層應用不使用了,就會刪除一個。
  • 3.ConnectionPool中會有一個背景工作定時清理StreamAllocation列表為空白的Connection。5分鐘時間,維持5個socket

3.選擇路線與建立串連

  • 1.選擇路線有兩種方式:
    • 1.無代理,那麼在本地使用DNS尋找到ip,注意結果是數組,即一個網域名稱有多個IP,這就是自動重連的來源
    • 2.有代理HTTP:設定socket的ip為Proxy 位址的ip,設定socket的連接埠為Proxy 位址的連接埠
    • 3.代理好處:HTTP代理會幫你在遠程伺服器進行DNS查詢,可以減少DNS劫持。
  • 2.建立串連
    • 1.串連池中已經存在串連,就從中取出(get)RealConnection,如果沒有命中就進入下一步
    • 2.根據選擇的路線(Route),調用Platform.get().connectSocket選擇當前平台Runtime下最好的socket庫進行握手
    • 3.將建立成功的RealConnection放入(put)串連池緩衝
    • 4.如果存在TLS,就根據SSL版本與認證進行安全握手
    • 5.構造HttpStream並維護剛剛的socket串連,管道建立完成

4.職責鏈模式:緩衝、重試、建立串連等功能存在於攔截器中網路請求相關,主要是網路請求最佳化。網路請求的時候遇到的問題

線程同步的問題,常用的線程同步

1.sycn:保證了原子性、可見度、有序性
2.鎖:保證了原子性、可見度、有序性

  • 1.自旋鎖:可以使線程在沒有取得鎖的時候,不被掛起,而轉去執行一個空迴圈。
    • 1.優點:線程被掛起的幾率減少,線程執行的連貫性加強。用於對於鎖競爭不是很激烈,鎖佔用時間很短的並發線程。
    • 2.缺點:過多浪費CPU時間,有一個線程連續兩次試圖獲得自旋鎖引起死結
  • 2.阻塞鎖:沒得到鎖的線程等待或者掛起,Sycn、Lock
  • 3.可重新進入鎖:一個線程可多次擷取該鎖,Sycn、Lock
  • 4.悲觀鎖:每次去拿資料的時候都認為別人會修改,所以會阻塞全部其他線程 Sycn、Lock
  • 5.樂觀鎖:每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號碼等機制。cas
  • 6.顯示鎖和內建鎖:顯示鎖用Lock來定義、內建鎖用synchronized。
  • 7.讀-寫鎖:為了提高效能,Java提供了讀

3.volatile

  • 1.只能保證可見度,不能保證原子性
  • 2.自增操作有三步,此時多線程寫會出現問題

4.cas

  • 1.操作:記憶體值V、舊的預期值A、要修改的值B,若且唯若預期值A和記憶體值V相同時,將記憶體值修改為B並返回true,否則什麼都不做並返回false。
  • 2.解釋:本機複本為A,共用記憶體為V,線程A要把V修改成B。某個時刻線程A要把V修改成B,如果A和V不同那麼就表示有其他線程在修改V,此時就表示修改失敗,否則表示沒有其他線程修改,那麼把V改成B。
  • 3.局限:如果V被修改成V1然後又被改成V,此時cas識別不出變化,還是認為沒有其他線程在修改V,此時就會有問題
  • 4.局限解決:將V帶上版本。

5.線程不安全到底是怎麼回事:

  • 1.一個線程寫,多個線程讀的時候,會造成寫了一半就去讀
  • 2.多線程寫,會造成髒資料
Asynctask和線程池,GC相關(怎麼判斷哪些記憶體該GC,GC演算法)

1.Asynctask:非同步任務類,單線程線程池+Handler
2.線程池:

  • 1.ThreadPoolExecutor:通過Executors可以構造單線程池、固定數目線程池、不固定數目線程池。

  • 2.ScheduledThreadPoolExecutor:可以延時調用線程或者延時重複調度線程。
    3.GC相關:重要

  • 1.搜尋演算法:
    1.引用計數
    2.圖搜尋,可達性分析

  • 2.回收演算法:
    1.標記清除複製:用於青年代
    2.標記整理:用於老年代

  • 3.堆分區:
    1.青年區eden 80%、survivor1 10%、survivor2 10%
    2.老年區

  • 4.虛擬機器棧分區:
    1.局部變數表
    2.運算元棧
    3.動態連結
    4.方法返回地址

  • 5.GC Roots:
    1.虛擬機器棧(棧楨中的本地變數表)中的引用的對象
    2.方法區中的類靜態屬性引用的對象
    3.方法區中的常量引用的對象
    4.本地方法棧中JNI的引用的對象

java類載入過程:
  • 1.載入時機:建立執行個體、訪問靜態變數或方法、反射、載入子類之前
  • 2.驗證:驗證檔案格式、中繼資料、位元組碼、符號引用的正確性
  • 3.載入:根據全類名擷取檔案位元組流、將位元組流轉化為靜態儲存結構放入方法區、產生class對象
  • 4.準備:在堆上為靜態變數劃分記憶體
  • 5.解析:將常量池中的符號引用轉換為直接引用
  • 6.初始化:初始化靜態變數
mvc、mvp、mvvm:
  • 1.mvc:資料、View、Activity,View將操作反饋給Activity,Activitiy去擷取資料,資料通過觀察者模式重新整理給View。循環相依性
    • 1.Activity重,很難單元測試
    • 2.View和Model耦合嚴重
  • 2.mvp:資料、View、Presenter,View將操作給Presenter,Presenter去擷取資料,資料擷取好了返回給Presenter,Presenter去重新整理View。PV,PM雙向依賴
    • 1.介面爆炸
    • 2.Presenter很重
  • 3.mvvm:資料、View、ViewModel,View將操作給ViewModel,ViewModel去擷取資料,資料和介面綁定了,資料更新介面更新。
    • 1.viewModel的商務邏輯可以單獨拿來測試
    • 2.一個view 對應一個 viewModel 商務邏輯可以分離,不會出現全能類
    • 3.資料和介面綁定了,不用寫垃圾代碼,但是複用起來不舒服
apk瘦身:

1.classes.dex:通過代碼混淆,刪掉不必要的jar包和代碼實現該檔案的最佳化
2.資源檔:通過Lint工具掃描碼中沒有使用到的靜態資源
3.圖片資源:使用tinypng和webP,下面詳細介紹圖片資源最佳化的方案,向量圖
4.SO檔案將不用的去掉,目前主流app一般只放一個arm的so包

ANR的形成,各個組件上出現ARN的時間限制是多少

1.只要是主線程耗時的操作就會ARN 如io
2.broadcast逾時時間為10秒 按鍵無響應的逾時時間為5秒 前台service無響應的逾時時間為20秒,後台service為200秒

Serializable和Parcelable 的區別

1.P 消耗記憶體小
2.網路傳輸用S 程式內使用P
3.S將資料持久化方便
4.S使用了反射 容易觸發記憶體回收 比較慢

Sharedpreferences源碼簡述

1.儲存於硬碟上的xml索引值對,資料多了會有效能問題
2.ContextImpl記錄著SharedPreferences的重要資料,檔案路徑和執行個體的索引值對
3.在xml檔案全部內載入到記憶體中之前,讀取操作是阻塞的,在xml檔案全部內載入到記憶體中之後,是直接讀取記憶體中的資料
4.apply因為是非同步沒有傳回值, commit是同步的有傳回值能知道修改是否提交成功
5.多並發的提交commit時,需等待正在處理的commit資料更新到磁碟檔案後才會繼續往下執行,從而降低效率; 而apply只是原子更新到記憶體,後調用apply函數會直接覆蓋前面記憶體資料,從一定程度上提高很多效率。 3.edit()每次都是建立新的EditorImpl對象.

ANR的形成,各個組件上出現ARN的時間限制是多少

1.只要是主線程耗時的操作就會ARN 如io
2.broadcast逾時時間為10秒 按鍵無響應的逾時時間為5秒 前台service無響應的逾時時間為20秒,後台service為200秒

apk瘦身:

1.classes.dex:通過代碼混淆,刪掉不必要的jar包和代碼實現該檔案的最佳化
2.資源檔:通過Lint工具掃描碼中沒有使用到的靜態資源
3.圖片資源:使用tinypng和webP,下面詳細介紹圖片資源最佳化的方案,向量圖
4.SO檔案將不用的去掉,目前主流app一般只放一個arm的so包

閱讀更多

20+個很棒的Android開源項目

我是如何進入Facebook的?

2018年Android面試題含答案—適合中進階(下)

看完你就該會git了(手把手教你用vue+node+mongodb搭建一個小商城

相信自己,沒有做不到的,只有想不到的

金9銀10,分享幾個重要的Android面試題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.