Android面試題目總結

最近剛換了工作,在這裏把各互聯網公司問到的題目做下總結。涉及的內容都是Android研發應該掌握的基礎問題,我把題目大概分爲JAVA,設計模式,Android,網絡,算法五類。最後邊列一下自己看過的技術書籍,希望大家都能提高自己,找到心儀的工作。

JAVA篇

  1. JAVA內存回收機制
    需要了解引用計數法,可達性分析法。
    需要知道標記清除,標記複製,標記整理。
    JVM分代回收算法流程。
    Java7的的新垃圾回收器。
    詳細可以去看《深入理解JAVA虛擬機》這本書

  2. JAVA中的引用,強引用,軟引用,弱引用,虛引用
    能說清各個引用的意思,瞭解ReferenceQueue,square公司的LeakCanary框架,MAT工具等。

  3. final關鍵字使用場景
    修飾類,修飾方法,修飾變量的意義

  4. static關鍵字使用場景
    修飾類,修飾變量,修飾方法,靜態塊,靜態導入。

  5. 集合類相關
    ArrayList,LinkedList,HashMap,TreeMap等內部實現原理。
    ArrayList與LinkedList區別,ArrayList與Vector的區別,HashMap與HashTable區別。

  6. 內部類,靜態內部類,局部內部類簡介,及內部類爲什麼默認持有外部類的引用
    JAVA編譯器會在內部類中加入類型爲外部類的成員變量,並提供相關參數的構造函數

  7. JAVA中如何實現多繼承
    通過實現多個接口及內部類的方式

  8. 線程池相關
    搞清Executor,ExecutorService,ThreadPoolExecutor關係。ThreadPoolExecutor中的參數使用。可以結合Executors工具類的newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool等方法說一說
    簡述下線程池原理,當時沒看過源碼,結合Volley中自己實現的線程池說了說,主要涉及到BlockingQueue,核心線程,最大線程等概念,需要多看源碼

  9. JAVA線程的幾種狀態,如何終止線程,進程與線程的區別。
    創建,就緒,運行,阻塞(同步塊,IO阻塞),主動睡眠,主動等待,銷燬。

  10. JAVA的wait,notify,notifyAll的用法,wait與sleep的區別
    wait掛起當前線程,等待sychronized的對象,notify喚醒一個wait的線程,notifyAll喚醒所有wait的線程。wait後線程會放棄鎖,sleep會持有鎖。

  11. 什麼是線程安全,如何保證線程安全

  12. JAVA的concurrent中的一些類,JAVA的鎖
    一些原子操作類,一些併發操作的集合類,一些更靈活的鎖

  13. JAVA併發內存模型,三大特性(原子性,可見性,有序性),volatile,synchronized關鍵字
    注意volatile的作用使用場景,原理,

  14. 什麼是多態,多態的使用場景,使用多態的意義

  15. switch中可以使用的類型
    int,byte,short,char,枚舉,JAVA7以上String,case後必須final的變量

  16. JAVA的ClassLoader,雙親委派
    判斷一個類是否相同,類加載器與類全名稱都得相同,優先委託父類加載器來加載類

  17. JAVA對象的初始化順序
    加載類
    初始化父類靜態變量
    執行父類靜態塊
    初始化子類靜態變量
    執行子類靜態塊
    初始化父類成員變量
    執行父類構造函數
    初始化子類成員變量
    執行子類構造函數

  18. try,catch,finally執行順序,finalize的調用時機,作用。

  19. JAVA的異常
    都實現Throwable接口,分Error,Exception兩類

  20. instanceof與getClass的區別
    object是否可以強轉爲某類型,可以用instanceof判斷。getClass獲得即某對象的Class對象

  21. Iterator,foreach,for,效率與線程安全
    Iterator迭代器可以在迭代過程中調用remove方法,做移除操作。foreach類似於迭代器,缺陷是不能移除,會出現併發異常。for過程中可以移除操作,注意一個問題索引問題。

  22. String,StringBuilder,StringBuffer

  23. object類中都有什麼方法,重寫equals方法也要重寫hashcode方法。

  24. long是否可以移位操作

設計模式篇

  1. 面向對象的六大原則
    單一職責原則
    里氏替換原則
    依賴倒置原則
    接口隔離原則
    開閉原則
    迪米特原則

  2. 單例模式,最常被要求手寫的設計模式
    一般寫懶漢式:雙重判斷的寫法(使用了volatile關鍵字,由於禁用指令重排優化,有一定的性能損耗),內部靜態類寫法(利用了JAVA類加載機制保證了線程安全),枚舉寫法(簡單逼格高,出現在effective java中,支持序列化),最好能說出他們的各種優勢缺點

  3. 觀察者模式

  4. 工廠模式:簡單工廠,工廠方法,抽象工廠

  5. 代理模式(代理模式的意義與作用)

  6. 裝飾模式(Context,JAVA的流相關類,裝飾模式與代理模式區別)

  7. 組合模式(Android的View與ViewGroup)

  8. 建造者模式(AlertDialog)

  9. 上述只是列出了幾個簡單常用的,還有其他自己應用過的設計模式(創建型,結構型,行爲型),最好結合自己的項目說一說,或者結合Android源碼講講,推薦書籍《Head First Design Pattern》《Android源碼設計模式解析與實戰》

  10. MVP,MVC,MVVM等等,結合自己的項目講講。

Android篇

  1. 消息機制

    • Handler,Looper,Message原理(幾乎所有技術面都會問到,最好詳細閱讀下源碼,能講清各個類的關係,他的消息處理流程,最好詳細看懂MessageQueue的next 方法,瞭解native層的消息機制。epoll機制等等,我自己閱讀源碼的分析(寫的不好請大家多多包涵)http://blog.csdn.net/industriously/article/details/50933315
    • 被問到的幾個Handler的問題:Activity內部Handler是否可以創建多個,Looper會把消息發給哪個Handler;子線程是否可以直接創建Handler,可以瞭解下HandlerThread與IntentService這兩個類;
    • Message隊列是個鏈表,插入刪除如何保證線程安全,非線程安全會出現什麼後果,畫圖描述下;Message.obtain()爲啥效率高。
  2. Activity生命週期(onSaveInstanceState 的調用時機,onWindowFocusChange調用時機,onConfigurationChanged)

  3. Activity的四中啓動模式,與onNewIntent回調

  4. Fragment生命週期(結合實際例子分析)

  5. Fragment與Activity通信

  6. Fragment使用中踩過的坑
    (必須有一個參數爲空的public構造函數,getActivity()空指針,與viewPager使用生命週期函數不會被調用,show,hide方法在被回收後恢復的fragment重疊問題等等,純fragment架構坑比較多)

  7. Service的生命週期(start,bind兩種)

  8. Service的onStartCommand方法的返回值,及其意義(START_STICKY,START_NO_STICKY,START_REDELIVER_INTENT,START_STICKY_COMPATIBILITY)

  9. Service運行在哪個進程,哪個線程。

  10. Android的事件派發機制,畫出一些View嵌套之後,能講清DOWN,MOVE,UP是怎麼傳遞的。dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。如何處理事件衝突。
    《Android開發藝術探索》中有一章專門介紹了事件的傳遞,與衝突處理。
    requestDisallowInterceptTouchEvent,onInterceptTouchEvent兩個方法

  11. 事件是如何知道要派發到哪個view上的
    MotionEvent中有點擊的x,y座標,結合view自身的座標大小,應該可以判斷。

  12. Android的繪製流程,如何使用onMeasure,onLayout,onDraw方法,ViewGroup的onDraw在沒有背景下不調用,可以調用dispatchDraw。結合自己寫過的自定義控件說一說。

  13. Android實現View移動的方法
    Scroller(注意移動的是子view),layout等等,詳細在《Android羣英傳》中有一章做了詳細介紹。

  14. AsyncTask的原理(Handler,線程池,Future),AsyncTask使用過程的坑。

  15. HandlerThread的原理,與IntentService的原理。

  16. 說一說Android中的動畫

  17. 視頻播放涉及到的,MediaPlayer的生命週期

  18. SurfaceView與View的區別

  19. RemoteView的用處
    桌面小部件,通知欄的自定義佈局。

  20. Android進程優先級
    前臺進程,可見進程,服務進程,後臺進程,空進程

  21. Android的誇進程通信
    AIDL,Messager,Binder,其實都是基於Binder,有興趣可以閱讀Binder源碼,很有挑戰性。
    其他:文件,數據庫,xml,socket等

  22. Android插件化原理,結合流行的插件原理,與自家公司的插件框架講講。還有插件如何通信。

  23. Android常見的框架OKHttp,Volley,Retrofit,OrmLite,ImageLoader,Fresco,LeakCanary,Rx Java,React Native,fastjson等自己熟悉的,最好看過他們源碼,能講清原理。

  24. ListView如何優化
    adapter的優化,Android羣英傳,中有講。

  25. UI優化(內存優化,繪製優化,佈局優化)

  26. 內存泄露處理,一般Context的泄露。如何發現,處理。

  27. Intent-Filter過濾規則,顯示意圖,隱式意圖。

  28. 常用adb命令

  29. Android的大圖載入
    保證不OOM;
    LRU cache;
    先Decode基本信息,在Decode具體數據;
    RegionBitmapDecoder加載局部圖形數據。

  30. 圖形矩陣變換,顏色矩陣變換

  31. 如何避免ANR

  32. JAVA對象序列化與Android序列化

  33. apk的打包流程

  34. sqlite數據庫相關的

  35. 看過哪些Android源碼(加分項)
    結合自己看過的源代碼說一說,面試官很喜歡有鑽研精神的人。推薦書籍鄧凡平《深入理解Android源碼》,老羅博客悠然紅茶的博客(感覺這個比老羅的源碼分析寫的通俗易懂),鴻洋博客

  36. 開放問題:關注過哪些Android新技術,對Google IO大會關注,你如何做性能優化的。

網絡篇

  1. TCP協議三次握手過程及其的目的。TCP斷開4次揮手。

  2. TCP,UDP的區別。

  3. http屬於哪一層

  4. http請求的時候都發生了什麼

  5. http協議分爲幾部分,請求行(GET,POST,PUT,DELETE等方式,協議版本號,請求路徑),請求頭(包含的字段),請求體;響應行(返回狀態碼),響應頭(包含的字段),響應體。

  6. Get,Post區別

  7. http請求頭響應頭都有哪些字段,說說keep-alive,trunk,range字段

  8. 優酷面試被問到:http的pipeline(這個之前沒聽過),移動wap的代理,發送一個http請求會有什麼區別

  9. http斷點下載原理

  10. push服務原理,xmpp協議

算法篇

  1. 基本排序算法:快速排序,堆排序,歸併排序,冒泡排序,插入排序,選擇排序,希爾排序。(能任意默寫,並說出原理,還有各種排序算法衍生的算法題目)

  2. 查找算法:二分查找,哈希查找

  3. 總結下常見面試題的算法,有些是面試被問到的。大部分摘自劍指offer,按照數據結構分了下類,前邊的標號表示書內的第幾個面試題。

    • 鏈表
      從尾到頭打印鏈表
      16:反轉鏈表
      17:合併兩個排序的鏈表
      判斷鏈表是否有環
      37:兩個鏈表的第一個公共節點
      15:求鏈表的倒數第k個節點
      O1時間內刪除鏈表節點
      26:複雜鏈表的複製
      56:鏈表中環的入口結點
      57:刪除鏈表中重複的結點(複雜點,需要考慮頭節點刪除,使用了指針的指針)

    • 棧,隊列
      兩個棧實現一個隊列,兩個隊列實現一個棧
      包含min函數的棧
      棧的壓入彈出序列

    • 二叉樹
      二叉樹的遍歷,先序,中序,後序。遞歸,非遞歸。(深度優先遍歷)
      6:重建二叉樹
      23:從上往下打印二叉樹(層序遍歷二叉樹,廣度優先遍歷)
      18:樹的子結構
      19:二叉樹的鏡像(先序遍歷,先判斷空,首先賦值交換兩個孩子)
      59:對稱的二叉樹(先序遍歷,判斷是不是都未null,返回true,返回一個爲null返回FALSE,判斷兩個不相等,返回FALSE )
      24:二叉搜索樹的後序遍歷序列(遞歸判斷,很類似於重建二叉樹,主要是找到根元素,然後劃分左子樹序列,右子樹序列,在遞歸重複上述過程)
      25:二叉樹中和爲某一值的路徑(進入的時候value壓入棧,最後方法返回的時候,彈出value,遞歸前判斷left,right不爲空)
      二叉搜索樹與雙向鏈表(中序便利)
      39:二叉樹的深度(遞歸,判斷left與right的大小,大的加1,node爲null返回0);判斷二叉樹是否平衡,後序遍歷求深度同時判斷是否平衡,兩個子樹高度差絕對值小於等於1才能深度加1,返回TRUE,否則返回FALSE。
      樹中兩個節點的最低公共祖先
      二叉樹的下一個結點
      60:把二叉樹打印成多行(用兩個變量,一個表示當前剩餘多少沒打印,另一個表示下一行有多少個元素)
      按之字形順序打印二叉樹
      序列化二叉樹
      二叉搜索樹的第k個結點
      數據流中的中位數

    • 字符串
      字符串的排列,字符的組合http://blog.csdn.net/industriously/article/details/51525630
      最長子串
      迴文串(左右掃描);迴文數(反轉數字是否等於原來數字);字符串中迴文串的個數;串中的最長迴文子串。
      替換字符串中的空格(先求出替換結果的數組長度,然後從後往前替換)
      把字符串轉換成整數(注意判斷正負數,判斷是否溢出,0x7FFF FFFF 0x8000 0000,判斷非法字符,判斷Null,空字符)
      正則表達式匹配(都到結尾匹配成功;pattern串到結尾,text串到結尾匹配失敗;單獨判斷*的情況(text走1步,pattern走兩步,text走1步,pattern不走,text不走,pattern走2步),在判斷.與普通字符情況)
      53:表示數值的字符串
      字符流中第一個不重複的字符(初始化hash爲-1,hash存儲字符位置,再次出現更新爲-2,最後打印hash表中最小的大於等於0的值的位置的字符)
      35:第一個只出現一次的字符(哈希存儲次數,然後遍歷獲取次數,打印第一個爲1的字符)
      42:翻轉單次順序VS左旋字符串(先反轉整體,在反轉局部)

    • 數組
      數組中重複的數字
      構建乘積數組
      3:二維數組中的查找
      4:替換空格(先求出替換結果的數組長度,然後從後往前替換)
      14:調整數組順序使奇數位於偶數前邊(兩個指針兩端掃描,不變順序可以採用插入排序思想)
      20:順時針打印矩陣
      31:連續子數組的最大和
      33:把數組排成最小的數字(前邊的數字小的放到前邊,mn與nm比較大小,然後快排,從小到大,輸出的就是最小數字)
      36:數組中的逆序對(歸併排序,並統計)
      38:數字在排序數組中出現的次數(二分查找,查找頭尾)
      40:數組中只出現一次的數字(哈希表存儲,或者,其他出現偶數次,這樣可以異或,單數異或爲1)
      41:和爲s的兩個數字VS和爲s的連續正數序列(哈希存儲;小於s逐漸遞增,大於s刪除最前邊的數字)

    • 排序,查找
      七大基本排序算法
      二分查找
      哈希查找
      旋轉數組的最小數字
      數組中出現次數超過一般的數字
      最小,最大的k個數
      38:數字在排序數組中出現的次數(二分)
      3:二維數組中的查找
      大文件(假設內存不能全部載入)中有很多int類型的數字,所有數字中有一個出現了兩次,其他的只出現了一次。求出現了兩次的數字。
      大文件中有一個數字出現頻率超過了百分之五十,找到這個數字。
      使用位向量法解決大文件問題。

    • 回溯法
      66:矩陣中的路徑
      67:機器人的運動範圍

    • 動態規劃
      0-1揹包問題
      最長公共子序列
      連續子數組最大和
      斐波那契數列,青蛙跳臺階,地板磚排列。

    • 其他
      位運算,二進制中1的個數
      11:數值的整數次方(考慮特殊情況,正負次方,任何0以外的數的0次方都是1)
      12:打印1到最大的n位數(n可能超出表示範圍,字符串全排列)
      32:從1到n整數中1出現的次數
      34:醜數
      43:n個骰子的點數
      44:撲克牌的順子
      45:圓圈中最後剩下的數字
      漢諾塔

書單

  1. Java書籍
    Head First Java
    Core Java
    Think in Java(以上書籍都可以做JAVA的基礎知識掃盲強化)
    Effective Java(很薄的一本書,適合有了一定JAVA經驗的看,做相關總結)
    深入理解Java虛擬機(理解JAVA虛擬機原理)
  2. Android書籍
    第一行代碼(Android基礎學習)
    Android開發藝術探索
    Android羣英傳
    Android研發錄
    Android應用性能優化
    深入理解Android源碼 卷1 2
    Android系統源代碼情景分析(老羅的書籍,比較晦澀)
    Android內核剖析(有點老)
  3. 設計模式
    Head First Design Pattern
    大話設計模式(入門書籍)
    Android源碼設計模式解析與實戰
  4. 數據結構算法
    數據結構-嚴蔚敏
    大話數據結構
    數據結構與算法分析:Java語言描述
    算法的樂趣
    劍指offer(70多道算法題,涵蓋了互聯網公司面試的大多數算法面試題)
    編程之美(比劍指offer稍微難一些的算法題)
    編程珠璣
  5. 其他(學習的亂七八糟的其他知識)
    數學之美(科普數學,算法,工程等相關知識的原理,讓非專業讀者也能領略數學的魅力)
    鳥哥的Linux私房菜(基礎學習篇)(主要是爲了學習shell)
    Linux內核設計與實現(講述Linux系統的原理)
    c++ Primer Plus
    Python基礎教程
    JavaScript高級程序設計(在校學習web前端買的,系統講了js)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章