臥槽,大佬把大廠真題給我了!(別點關注,別點贊,看文章,求大家了!)

面試題彙總

前言

面試真題由Android研習社社員提供,這一次放出來是爲了幫助你們更好的準備面試;部分題目寫了一些答案,僅供參考,你們關注問題自己就好java

想加大佬微信?或者深刻學習的,掃描下方二維碼,一塊兒來探討!c++

技術題目

Java相關

  • JNI 分配的對象是在棧上仍是堆上?JNI 怎麼調用 Java,Java 怎麼調用 JNI,數據如何傳遞?JNI 與 JNA 有什麼區別?
  • HashMap 你能瞭解嗎?你能說說它的數據結構是什麼樣的嗎?
  • 動態代理是如何實現的?有沒有看過相關源碼?
  • 範型的協變了解嗎?
設計模式
  • 講講你項目中用的設計模式?
  • 設計模式你最熟的是哪一個?
你們平時接觸最多的設計模式確定就是單例了。有時候面試官會提問,除了單例模式,你最熟悉的設計模式是什麼?

我仍是先來講一下單例吧

如今通常咱們都會寫靜態單例,或者雙重校驗鎖,靜態單例原理好像是利用的jvm中靜態實例只會加載一次的特性,因此以後再去獲取的時候確定是惟一的;

而後說一下雙重校驗鎖。爲何要雙重校驗呢?若是隻校驗一次可不能夠呢?實際上是能夠的,多線程去獲取鎖對象的時候遇到synchronize加鎖的代碼塊,確定須要先獲取鎖才能進行下一步操做。可是這裏就有一個問題,就是效率不高,每次都須要去查看鎖對象是否被搶佔。因而纔有了雙重校驗鎖,先在synchronize代碼塊外進行一次非空判斷(沒有加鎖,減小了獲取鎖的時間),若是不爲空就直接返回了;若是爲空,再進行進一步的同步獲取鎖的操做。

那雙重校驗鎖有缺點嗎?實際上是有的,就是jvm可能會對執行進行重排,致使建立對象時,可能變量和內存都申請完成,可是把實例數據放置到內存空間這一步沒有完成,致使對象爲空的狀況。

這個問題的根本緣由,實際上是指令重排致使的有序性問題。

解決可見性問題,java提供了volatile關鍵字,就可以針對該對象禁用指令重排。



而後再來按照面試官的要求,說一下適配器模式。適配器模式在Android中應用的很普遍了,通常是用來作數據和UI的接口適配器。

在Android以外,其實你們都不是很看好適配器模式。由於它是固有設計不合理才產生的,把一個接口,轉化爲另外一個接口。這也是適配器模式的概念,把兩個不兼容的接口,經過統一的接口適配爲一個能夠調用的接口方式。

可是在Android中這個模式反而如魚得水,由於總有需求要把數據呈現到UI上來,適配器模式實際上是實現了相同數據格式的呈現接口的複用,減小了冗餘代碼,也把數據和UI作了解藕。

除了適配器模式,我在項目的實際使用中還使用過構造者模式和觀察者模式。
構造者模式通常用來和工廠模式作對比,他們都是構建型設置模式,構造者模式是針對的複雜對象,好比說一個類初始化須要穿10幾個參數,那對於使用者來講,第一不易讀,第二寫着也不方便,傳10多個參數簡直就是噩夢。
構造者模式實際上是把各個參數獨立出來,提供單獨的方法來設置,而後返回本類對象,實現能夠鏈式調用。


複製代碼
網絡
  • http和https的區別
  • HTTPS 的工做原理和連接創建過程,非對稱加密用來加密什麼數據?對稱加密用來加密什麼數據?
多線程
  • 說一下多線程的同步方式
  • 說一下線程池
  • 多線程執行中,如何實現每一個線程有序輸出ABC ABC?
  • 單例的建立模式介紹一下?雙重檢查鎖有沒有缺陷?
  • 你是會對方法加鎖?仍是對語句塊加鎖呢?
  • 寫 DoubleCheck 的單例,並講講兩次 check 的意義是什麼?是否能夠去掉?若是去掉了某一個(或所有)會不會出問題?
  • 如何保證代碼運行的原子性?加鎖的方式有哪些?
首先說下什麼是原子性。原子性,從表面上看是不能分割,本質上不可中斷,也就是說操做有一致性的要求。
好比說付款這個操做,必定是涉及到轉出和轉入操做的一直性,也就是原子性。

在java中,多個線程間要保證一致性其實就是要對其進行加鎖。這個說的是業務層面的原子性。

加鎖的方式,能夠直接在方法上家sync關鍵字,jvm會自動在方法開始的地方加上look,在方法結束的地方加上unlook,保證它們是成對使用的。這種方法的鎖對象是該類的實例對象。

還能夠對代碼塊進行加鎖,減小臨界區的範圍,提升性能。若是是sync(this),鎖對象也是該類的實例對象,
若是是sync(非this對象),那是用的鎖就是這個對象。

另外除了直接使用sync關鍵字,還能夠直接使用look和unlook進行加鎖和解鎖,可是不要忘了他們須要成對使用

複製代碼
  • CountDownlatch 的使用場景是什麼?
先說一下實際的應用場景吧,好比在作app啓動優化的時候,若是多個異步任務有依賴關係,

好比taskA必須在taskB和taskC,taskD,都異步執行完以後再執行,那就能夠用countDownlatch在主線程使用await阻塞等待,

設置countDownlatch(3),每完成一個任務就執行一次countdown,

當三個如今都執行完成後,await阻塞等待結束,就能夠執行taskA了

如今來總結下,該類主要是用來處理多個線程異步執行時做爲條件變量來進行阻塞判斷的情景。

複製代碼
JVM
  • 說一下java的垃圾回收機制
  • JVM 的內存區域劃分是什麼樣的?你能說說爲何這樣劃分嗎?
  • 說一下類的整個加載過程
  • 講講當我要建立對象時都會發什麼?

Android相關

Handler快問快答面試

  • 說一下handler機制?
  • 子線程如何使用 Handler?
  • 說一下你對Handler中ThreadLocal的理解?
  • handler的postDelay是一種什麼樣的狀態?
  • 如何對sendMsg進行攔截?
  • 說一下你對IdleHandler的瞭解
  • 對當前頁面進行截圖?
  • 列表三層展開如何實現?
  • 可否在子線程刷新 UI?
  • ANR 如何排查?
  • invalidate 和 requestLayout 的區別?
  • 滑動衝突如何解決?
  • 在 Activity 的生命週期中能夠拿到 View 的明確寬高?
  • 主線程的 Looper 何時建立的?ActivityThread 的 main 何時調用?
  • OkHttp 源碼讀過嗎?鏈接複用瞭解過嗎?
  • 講講你瞭解的 Adnroid 進程間通訊?Binder 是如何工做的?項目中有使用到進行通訊嗎?
  • 如何實現完成上傳九張圖片後的進行數據處理的一個操做?
  • 自定義 ViewGroup 須要重寫哪些方法?
  • 你說你熟悉屬性動畫,那來說講?
  • 來說講觸摸反饋流程?如何中斷某個事件或者說不想讓他往下傳,能不能更早?
  • 事件的衝突你有處理過嗎?
  • 有作過性能優化嗎?哪些方面?怎麼作的?
  • App 的內存優化應該怎麼作?
  • 非靜態內部類會引發內存泄漏嗎?怎麼解決?若是我必定要使用非靜態內部類那應該怎麼處理?
  • 一個線程中能有幾個 Handler?如何保證惟一?
  • 主線程的 Looper 與子線程的 Looper 有什麼區別?
  • 講一下 App啓動流程?
  • 美團餓了麼列表中下拉刷新的快遞員跑步會騎車動畫如何實現?
  • Recycler 如何添加 Header?
  • OkHttp 底層是怎麼工做的?如今讓你設計 Http 庫你會怎麼設計?
  • 線程池開幾個線程比較好呢?
  • 線程切換怎麼作?Handler 是怎麼實現線程切換的呢?
  • 二倍圖和三倍圖是什麼概念?圖片應該放在哪一個目錄下更合適?
  • 多渠道打包你用過嗎?
  • build 配置文件中,你都寫過什麼?
  • ART虛擬機對垃圾回收有什麼優化嗎?
  • 說一下ART安裝時的優化
  • OkHttp的請求URL中若是有中文字符會出現亂碼嗎?
  • OkHttp是如何發起一個Http請求的?
  • Okhttp的緩存是如何實現的?
  • Android9.0中如何使用http?
  • LruCache是怎麼實現的?
  • 說一下View,activity,window三者之間的關係
  • Android 7.0 以後須要作哪些適配工做?
  • 自定義view的重疊繪製如何優化?
  • 讀過AsyncTask源碼嗎?他是同步仍是異步?
  • Material design 相關的控件瞭解嗎?
  • 如何用自定義view實現Android的導航欄?中間的圓按鈕須要超出父佈局的限制,這個怎麼實現?或者怎麼處理?
  • 請說一下你對Retrofit的原理的理解?
  • 說一下你對MVVM的理解?有什麼優缺點?
  • 針對 Target 28 的適配遇到過什麼問題?
  • 三方Sdk若是不使用Https,應該怎麼適配?
  • 說下對ConstraintLayout的瞭解,即對MotionLayout的瞭解?
  • Dagger2中的做用域是怎麼實現的?
  • 項目中Dagger的Component是怎樣的關係?
  • Dagger2是如何動態生成對象的?有沒有什麼問題?
  • EventBus有什麼缺點?
  • 兩個進程分別持有一個HttpClient,在進程1中發送100個Https請求,每次請求都會發生一次ssl的過程嗎?在進程2中又發了一次Https請求,Host相同,會不會複用進程1的請求?
  • 說一下Apk的安裝過程?
  • 平時咱們使用啓動界面的時候都是經過Intent傳遞數據的,若是想經過依賴注入的方式,應該怎麼設計?
  • NestedScroll是如何實現的?如何自定義一個嵌套滑動控件?
  • 講一下View的事件分發機制?
  • 說一下LayoutParams的原理?
  • 說一下對RecylerView緩存機制的理解?

其餘

  • audioRecod 與 MediaRecoder 的區別?
  • 你 AudioRecoder 如何使用的?好比在特定場景下你如何使用的?
  • 瞭解過音頻的壓縮格式嗎?mp3 的的壓縮格式是怎麼樣的?
  • 說下Https 的工做原理?
  • 你 SDK 的項目架構是什麼樣的?怎麼設計的?
  • Flutter 瞭解過麼?Flutter 如何與 Native 層交互?
  • Kotlin 會嗎?記得 Kotlin 有哪些特性?你對 Kotlin 瞭解到什麼程度,Kotlin 有什麼好處?有沒有用過Kotlin Anko?
  • Kotlin 的inline 方法和 inline 參數有了解嗎?
  • c / c++ 會嗎?
  • 你有看過什麼源碼?講講 OkHttp 源碼?
  • 接觸過組件化嗎?你對組件化的理解是什麼樣的?
  • 你作過的全部東西中你以爲最複雜的是什麼?
  • so 庫有兼容和加載是如何完成的?我不少不少架構的 so 最終會使用哪一個?
  • 推送的流程是怎麼樣的?假如如今讓你設計一個推送的模塊你會怎麼設計?如何提高推送送達率?
  • 鎖在操做系統級是如何實現的呢?
  • 如何不經過臨時變量交換兩個變量?
  • 介紹下你在Android技術上的優點?
  • 學習過哪些第三方庫?
  • 最新的技術棧用過哪些?
  • 熱修復的使用場景是什麼?對熱修復框架的原理和區別有沒有了解?
  • 埋點,Hook事件有了解嗎?
  • 介紹下項目的架構?
  • Keep-Alive是什麼原理?講一下工做流程?
  • Tcp,Udp的長鏈接是怎麼作的?如何保證長鏈接的安全,保證沒有被竊聽及服務器的合法性?消息的解析和發送怎麼設計?長鏈接的重試怎麼作?
  • 說下對Clean 架構 ,及MVP的理解?

非技術題目

  • 你還有什麼要問個人嗎?
  • 有過主導 App 開發的經歷嗎?
  • 介紹下你負責作的這部份內容的完整流程是什麼?
  • 你爲何離職?
  • 平時喜歡經過什麼樣的途徑去學習?你最近學的一個技術點是什麼?
  • 你平時是如何定位問題的?
  • 你在公司中負責的是哪一塊的工做?
  • 找工做傾向於哪些方面?

特別感謝:Android研習社社長--南山丶Gzw設計模式

鄭重聲明緩存

本文由Android研習社社羣創做,版權©️歸Android研習社全部,侵權必究!安全

相關文章
相關標籤/搜索