Android面試遇到的問題(1)

數據結構和算法類

  • 順序表和鏈表的區別?

    順序表隨機訪問快,插入刪除慢;鏈表插入刪除快,隨機訪問慢。

  • 棧和隊列的區別?

    棧:先進後出,隊列:先進先出

  • 常用的排序算法有哪些?

    冒泡排序、選擇排序、快速排序、堆排序等。

  • 快速排序的實現思想是怎樣?快速排序的時間複雜度是多少?

    1. 劃分,在待排序的數列中隨機選擇一個x,然後通過比較最終確定它在數列中的最終位置。這個數將原數列分成三部分:比x小的數、x、比x大的數。
    2. 在“比x小的數”和“比x大的數”中遞歸使用1的方法進行劃分。直到每一個數都確定最終位置。
    3. 因爲是不斷地折半,所以時間複雜度是O(Log2 N)
  • 冒泡排序的時間複雜度是多少?

    O(n^2)

  • 堆排序的原理是怎樣?

    1. 需要先解釋堆這種數據結構(完全二叉樹),對每個非葉子節點,都有:左孩子比父節點小,右節點比父節點大。
    2. 將堆調整爲大根堆或者小根堆的過程。
    3. 時間複雜度是O(N*LogN)
  • 樹有哪幾種遍歷方式?

    前序遍歷、中序遍歷、後續遍歷

  • 對稱加密算法有哪幾種?

    • 對稱加密:加密和解密使用同一個密鑰。有DES、3DES、AES等。
    • 非對稱加密:加密和解密需要兩個Key:公鑰和私鑰。有RSA、DSA等
  • Hash算法是怎樣的?

    Hash算法(摘要算法)

    • Hash算法特別的地方在於它是一種單向算法,用戶可以通過Hash算法對目標信息生成一段特定長度的唯一的Hash值,卻不能通過這個Hash值重新獲得目標信息。因此Hash算法常用在不可還原的密碼存儲、信息完整性校驗等。
    • 常見的Hash算法有MD2、MD4、MD5、HAVAL、SHA
    • 哈希(Hash)算法,即散列函數。它是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。同時,哈希函數可以將任意長度的輸入經過變化以後得到固定長度的輸出。
  • 畫出HashMap的數據結構實現
    網上找到一篇帖子:HashMap實現原理分析 ,感謝作者!

設計模式類

  • 熟悉哪些設計模式,說明面試官指定的某個模式的具體的實現及原理。

    單例、工廠、觀察者、組合、代理、適配器、裝飾者、Builder等。說自己理解的,不要給自己挖坑。面試官會繼續問實現和使用的。

  • 單例模式的缺點是什麼?

    1. 單例模式在Android中生命週期較長,如果單例持有activity的引用,容易引發內存泄露問題。比如將登錄模塊的所有動作封裝成的單例LoginBiz。
    2. 找到一篇博客單例模式優缺點
  • 工廠模式有哪幾種?簡單工廠模式和工廠方法模式的區別是什麼?

    簡單工廠模式、工廠方法模式、抽象工廠模式

  • 適配者模式有哪幾種?

  • 靜態代理和動態代理的區別是什麼?

    1. 根據代理類的生成時間不同分爲靜態代理動態代理
    2. 靜態代理:由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。
    3. 動態代理類:在程序運行時,運用反射機制動態創建而成。

Java基礎類

  • 什麼是多態?多態的實現機制/原理是什麼?

    • 在面嚮對象語言中,接口的多種不同的實現方式即爲多態。
    • 父類的指針可以指向子類的對象
    • 多態性在C++中都是通過虛函數實現的
    • 多態的實現基礎是動態綁定
  • HashCode相等的兩個對象是否一定equals?


    如果對象equals 是true,hashCode需要相同;但是hashCode相同的對象不一定equals。因爲:

    • hashCode方法可以被重載,可能導致不同的對象擁有相同的哈希值。
    • Java中的hash函數返回的是int類型,最多允許存在2^32個,是有限的,所以兩個不同的對象有可能恰好擁有相同的哈希值
  • 一個對象什麼時候會被垃圾回收器回收?

    內存不足,且這個對象GC Root不可達時

  • Java虛擬機中的內存分哪幾個區?GC垃圾回收機制是怎樣的?

    方法區、棧、堆、本地方法區等。

  • 內存泄露和內存溢出的區別和聯繫?

    內存泄露:本該釋放的內存沒有釋放,並且自己也無法訪問了。
    內存溢出:申請的內存大於系統剩餘可分配的內存。精滿自溢。
    內存泄露容易引發內存溢出。

  • 怎樣解決併發問題?有哪些關鍵字?2個線程間的併發問題和10個線程間的併發問題複雜度是否一樣?

    synchronize,volatile
    線程越多,等待資源的問題越嚴重。

  • 什麼是死鎖?

    是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。

  • Concurrent包中有哪些類?

  • RuntimeException有哪些常見的子類?

    • NullPointerException - 空指針引用異常
    • IndexOutOfBoundsException - 下標越界異常
    • IOException - 輸入輸出異常
    • ClassCastException - 類型強制轉換異常
    • 可參考常見的幾種RuntimeException
  • RuntimeException和Exception的區別是什麼?

    • Exception:在程序中必須使用try…catch進行處理。
    • RuntimeException:可以不使用try…catch進行處理,如果有異常產生,將由JVM進行處理。
  • 關鍵字throw和throws的區別是什麼?

    • throws:寫在方法聲明中,表示這個方法可能會拋出這些異常,調用者可能要處理這些異常。
    • throw: 寫在方法體內,明確了這個地方要拋出這個異常。
  • 有沒有使用過未捕獲的異常?

    Android中使用UncaughtExceptionHandler捕獲全局異常。
    後期不用UncaughtExceptionHandler,直接使用友盟統計線上崩潰。

  • 集合有哪些?Collection有哪些子類?

    Collection
    ├List
    │├LinkedList
    │├ArrayList
    │└Vector
    │ └Stack
    └Set-HashSet

    Map
    ├Hashtable
    ├HashMap

  • Collection和Collections的區別?

    Collection是集合接口
    Collections是工具類,含有sort、binarySearch、reverse等方法。

  • HashMap怎麼遍歷?

    迭代器
    可參考遍歷HashMap的四種方法

Android基礎類

  • 消息推送的原理是什麼?

    維持一個長連接

  • ContentProvider和SQLite的區別和聯繫是什麼?

    • SQLite:android平臺上的輕量級數據庫
    • ContentProvider:向其他應用暴露接口訪問自己的數據,接口內容由自己定義,一般通過SQLite方式,也可以文件方式等!
  • IntentService和Service的區別是什麼?

  • 一個Activity啓動另一個Activity時,調用了各自的哪些生命週期函數?
  • Activity和Fragment之間怎麼相互通信?

    Activity 傳給Fragment:setArgument()
    Fragment傳給Activity: Fragment中有Activity的引用,直接修改Activity的屬性或者調用Activity的成員方法。

  • ViewPager+Fragment怎樣實現懶加載?
  • 怎樣彈出像QQ在別處登錄時彈出的那種全局對話框?
  • 你的App開發中有哪些單例?什麼時候初始化?

    UserInfo、PathManager等,Application中初始化。

  • 有沒有使用過多進程開發?進程間有哪幾種通信方式?

    進程間通信的方式:Content Provider、Broadcast、AIDL、Messenger、文件共享、Socket等

  • Binder機制是什麼?
  • View的繪製流程是怎樣?三個流程方法的時序是怎樣?onMeasure中有哪幾種測量模式?

    onMeasure()、onLayout()、onDraw()
    3種測量模式:EXACTLY、AT_MOST、UNSPECIFIED

  • View的事件分發流程是怎樣?主要有哪幾個函數,他們的調用先後順序是怎樣?
    DispatchTouchEvent()、OnInterceptTouchEvent()、onTouchEvent(),責任鏈模式
  • Android開發中哪些情況容易造成內存泄露?怎樣解決?
  • 有沒有做過JNI?System.gc能不能把C++層面的對象給回收掉?
  • 你在實際開發中遇到哪些內存泄露的例子?是怎麼解決的?
  • 內存泄露的工具使用?內存泄露的檢測。MAT怎樣查看具體哪個對象泄露?

    MAT
    leakCanary 參考 LeakCanary使用指南(1)

  • 開發中是否遇到過ANR問題,是怎麼排查的?

    首先分析log
    從trace.txt文件查看調用棧,adb pull data/anr/traces.txt ./mytraces.txt
    看代碼
    仔細查看ANR的成因(iowait?block?memoryleak?)
    1、在activity中超過5秒的時間未能響應下一個事件。
    2、BroadcastReceive超過10秒

  • 你選擇一個網絡框架的標準是什麼?怎樣纔算一個合格的網絡請求框架?你封裝一個網絡請求框架的要點是什麼?

  • 看過哪些框架的源碼?
  • EventBus和ButterKnife是作什麼用的?
  • 使用過哪些圖片框架?什麼是三級緩存?LRU策略是什麼?Glide可以設置哪些東西?
  • 有沒有使用過MVP模式?
  • 使用過哪些佈局輔助工具?

需要強記的Android基礎知識


  • Activity、Fragment生命週期

  • Activity: onCreate(), onStart(), onResume(), onPause(), onStop(), onStop(), onRestart()
  • Fragment: 與Activity相比,沒有onRestart(), 多了onAttach(), onCreateView(), >onActivityCreated(), onDestroyedView, onDetach(), onViewCreated()
  • Activity的四種啓動模式和區別。Standard和SingleInstance好說,都是極端,SingleTop和SingleTask要區分。SingleTop是頂部複用,即A->B->C->C,結果是複用C,不會再重新啓動C。而SingleTask是A->B->C->A,結果是A,會把BC清掉。

    通過Acitivty的xml標籤來改變任務棧的默認行爲
    使用android:launchMode=”standard|singleInstance|singleTask|singleTop”來控制Acivity任務棧。
    任務棧是一種後進先出的結構。位於棧頂的Activity處於焦點狀態,當按下back按鈕的時候,棧內的Activity會一個一個的出棧,並且調用其onDestory()方法。如果棧內沒有Activity,那麼系統就會回收這個棧,每個APP默認只有一個棧,以APP的包名來命名.

    • standard : 標準模式,每次啓動Activity都會創建一個新的Activity實例,並且將其壓入任務棧棧頂,而不管這個Activity是否已經存在。Activity的啓動三回調(onCreate()->onStart()->onResume())都會執行。
    • singleTop : 棧頂複用模式.這種模式下,如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,所以它的啓動三回調就不會執行,同時Activity的onNewIntent()方法會被回調.如果Activity已經存在但是不在棧頂,那麼作用與standard模式一樣.
    • singleTask: 棧內複用模式.創建這樣的Activity的時候,系統會先確認它所需任務棧已經創建,否則先創建任務棧.然後放入Activity,如果棧中已經有一個Activity實例,那麼這個Activity就會被調到棧頂,onNewIntent(),並且singleTask會清理在當前Activity上面的所有Activity.(clear top)
    • singleInstance : 加強版的singleTask模式,這種模式的Activity只能單獨位於一個任務棧內,由於棧內複用的特性,後續請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷燬了
  • Handler原理

  • AsyncTask原理?AsyncTask中的線程池是串行還是並行?
    看版本
  • Recycler和List的區別,ListView的優化,重用機制
  • 上帝視角類


    • 什麼是64k問題?爲什麼有這個問題?
    • 是否隨時關注着Google在Android方面的新動向?
    • Android5.0以後有哪些新特性?
    • 對Android的前景怎麼看?你個人的近期(一年)規劃是怎樣?
    • 有沒有開源過項目?
    • 對各種開源組件怎麼技術選型?
    • APP如何調優?
    • 怎樣設計Android和iOS統一的接口,屏蔽掉Context,因爲iOS中沒有Context。

    面試者可能想聽到的回答是Hybrid開發。

  • 請舉一個你實際解決問題的實例。

    • 生產環境和測試環境頻繁切換,需要重新打包。在App中增加後門,可配置環境。
  • 你的優勢是什麼?

    計算機專業基礎、學歷、英語(直接閱讀英文技術文檔的能力)、學習能力(從Java迅速轉Android、有從0到1的項目經歷)等

  • 怎樣使用EditText在不本地緩存的情況下實現快速搜索的聯想功能?可以網絡請求,但是用戶的輸入很快,需要實時響應。不能使用AutoCompleteTextView。

    有可能是他們實際開發中無法解決的問題拿出來考面試者

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章