- (一) java基礎面試知識點
- java中==和equals和hashCode的區別
- 探探對java多態的理解:重載和重寫
- String、StringBuffer、StringBuilder區別:StringBuffer 線程安全,StringBuilder單線程中效率高。
- 什麼是內部類?內部類的作用
- 抽象類是否可以沒有方法和屬性:可以。
- 泛型中extends和super的區別
- 父類的靜態方法能否被子類重寫:不能
- 進程和線程的區別:進程是操作系統資源分配的基本單位(運行時分配單獨內存空間),而線程是任務調度和執行的基本單位。
- final,finally,finalize的區別
- Serializable 和Parcelable 的區別
- 靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
- 靜態內部類的設計意圖
- 成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用
- 談談對kotlin的理解
- 閉包和局部內部類的區別
- string 轉換成 integer的方式及原理:依次讀取每個字符,根據進制轉換爲整數。
- (二) java深入源碼級的面試題(有難度)
- 哪些情況下的對象會被垃圾回收機制處理掉?
- 靜態代理和動態代理的區別,什麼場景使用? 動態代理是在運行時,通過反射機制實現動態代理,並且能夠代理各種類型的對象,複用性強。面向切面編程。
- Java的異常體系:Throwable是所有異常的父類,分Error好Exception;Error表示很嚴重的問題發生了,可以捕獲但是不要捕獲,因爲捕獲了也解決不了,這個不是由程序產出的,底層出現問題就讓他它掛了吧。
- 談談你對解析與分派的認識。Class 文件的常量池中存有大量的符號引用,字節碼中的方法調用指令就以常量池中指向方法的符號引用作爲參數。這些符號引用一部分會在類加載階段或者第一次使用的時候就轉化爲直接引用,這種轉化稱爲靜態解析。另一部分將在每次運行期間轉化爲直接引用,稱爲動態連接(動態分派)。
- 如何將一個Java對象序列化到文件裏:Serializable。
- 說說你對Java反射的理解:可以在運行時獲取和使用類的信息,用invoke 方法。
- 說說你對Java註解的理解: 對程序代碼本身的描述-代碼元數據,一種約定的規範,包括格式、意義、作用域等。主要作用:生成文檔,代碼分析,編譯檢查。
- 說說你對依賴注入的理解:控制反轉、依賴注入。把方法實施的主題當參數傳入。
- String爲什麼要設計成不可變的:字符串常量池的需要,允許String 對象緩存hashcode(效率優化),安全性。
- Object類的equal和hashCode方法重寫,爲什麼?
- (三) 數據結構
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 列舉java的集合以及集合之間的繼承關係
- 集合類以及集合框架
- 容器類介紹以及之間的區別(容器類估計很多人沒聽這個詞,Java容器主要可以劃分爲4個部分:List列表、Set集合、Map映射、工具類(Iterator迭代器、Enumeration枚舉類、Arrays和Collections),具體的可以看看這篇博文 Java容器類)
- List,Set,Map的區別
- HashMap的實現原理
- HashMap源碼理解
- HashMap如何put數據(從HashMap源碼角度講解)?
- HashMap怎麼手寫實現?
- ConcurrentHashMap的實現原理
- HashTable實現原理
- TreeMap具體實現
- HashMap和HashTable的區別
- HashMap與HashSet的區別
- HashSet與HashMap怎麼判斷集合元素重複?
- 集合Set實現Hash怎麼防止碰撞
- ArrayList和LinkedList的區別,以及應用場景
- 二叉樹的深度優先遍歷和廣度優先遍歷的具體實現
- 堆和樹的區別:堆是一種特殊的樹。
- 堆和棧在內存中的區別是什麼(解答提示:可以從數據結構方面以及實際實現方面兩個方面去回答)?
- 什麼是深拷貝和淺拷貝:淺拷貝是拷貝地址,深拷貝是複製一份同樣的數據。
- 手寫鏈表逆序代碼
- 講一下對樹,B+樹的理解
- 講一下對圖的理解
- 判斷單鏈表成環與否?
- 鏈表翻轉(即:翻轉一個單項鍊表)
- 合併多個單有序鏈表(假設都是遞增的)
- (四) 線程、多線程和線程池
- 開啓線程的三種方式:Thread, Runnable, 使用Callable和Future創建線程。
- 線程和進程的區別:進程是操作系統資源分配的基本單位(獨立的內存),而線程是任務調度和執行的基本單位。
- 爲什麼要有線程,而不是僅僅用進程:進程只能在一個時間幹一件事情,如果堵塞了,整個進程就會掛起。線程有助於併發,提高利用率。
- run()和start()方法區別:直接調用run是在本線程中,
- 如何控制某個方法允許併發訪問線程的個數:利用Semaphore
- 在Java中wait和seelp方法的不同;sleep()方法是屬於Thread類中的。而wait()方法則是屬於Object類中。調用sleep後不會釋放鎖,wait會釋放。
- 談談wait/notify關鍵字的理解:在生產者調用notify()後,消費者並沒有立即被喚醒,而是等到生產者退出同步塊後才喚醒執行。
- 什麼導致線程阻塞? sleep,wait, yield,join, suspend。
- 線程如何關閉? 設置標誌位,調用interrupt方法。
- 講一下java中的同步的方法:synchronized,volatile,重入鎖,wait與notify,ThreadLocal,BlockingQueue,AtomicInteger 原子變量。
- 數據一致性如何保證?
- 如何保證線程安全?
- 兩個進程同時要求寫或者讀,能不能實現?如何防止進程的同步?
- 線程間操作List
- Java中對象的生命週期
- Synchronized用法:鎖對象,方法(包括靜態方法),代碼塊,
- synchronize的原理
- 談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解
- static synchronized 方法的多線程訪問和作用
- 同一個類裏面兩個synchronized方法,兩個線程同時訪問的問題。不可以。
- 談談NIO的理解(先忽略)
- synchronized 和volatile 關鍵字的區別
- synchronized與Lock的區別
- ReentrantLock 、synchronized和volatile比較:syncrhronized 使用簡單,ReentrantLock 在競爭激烈時效率更高。
- ReentrantLock的內部實現
- lock原理
- 死鎖的四個必要條件:互斥、佔用且等待、不可搶佔、循環等待。
- 怎麼避免死鎖?主要是破壞後面三種情況。
- 不允許進程在已獲得某種資源的情況下,申請其他資源。
- 允許對資源進行搶奪。
- 將系統中的所有資源統一編號,進程可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出。
- 什麼是線程池,如何使用: java.util.concurrent.Executors
- Java的併發、多線程、線程模型。線程模型:使用內核線程實現、使用用戶線程實現和使用用戶線程加輕量級進程混合實現。參考:https://www.cnblogs.com/wade-luffy/p/6051384.html
- 多線程有什麼要注意的問題?
- 談談你對多線程同步機制的理解?
- 如何保證多線程讀寫文件的安全?
- (五)併發編程有關知識點(這個是一般Android開發用的少的,所以建議多去看看):
- 平時Android開發中對併發編程可以做得比較少,Thread這個類經常會用到,但是我們想提升自己的話,一定不能停留在表面,,我們也應該去了解一下java的關於線程相關的源碼級別的東西。
- 附;java進階與Android內核技術大綱
- image
- 二、Android面試題
- Android面試題包括Android基礎,還有一些源碼級別的、原理這些等。所以想去大公司面試,一定要多看看源碼和實現方式,常用框架可以試試自己能不能手寫實現一下,鍛鍊一下自己。
- (一)Android基礎知識點
- 四大組件的生命週期和簡單用法
- Activity各種情況下的生命週期
- Activity與Fragment之間生命週期比較
- Activity上有Dialog的時候按Home鍵時的生命週期
- 前臺切換到後臺,然後再回到前臺,Activity生命週期回調方法。彈出Dialog,生命值週期回調方法。
- Activity的四種啓動模式對比
- Activity狀態保存與恢復:複寫onSaveInstanceState和onRestoreInstanceState
- fragment各種情況下的生命週期
- Fragment狀態保存startActivityForResult是哪個類的方法,在什麼情況下使用?
- 如何實現Fragment的滑動:ViewPager
- fragment之間傳遞數據的方式?
- Activity 怎麼和Service 綁定?
- 怎麼在Activity 中啓動自己對應的Service?
- service和activity怎麼進行數據交互
- Service的開啓方式
- 請描述一下Service 的生命週期
- ContentProvider的原理
- 說說ContentProvider、ContentResolver、ContentObserver 之間的關係
- 請描述一下廣播BroadcastReceiver的理解
- 廣播使用的方式和場景
- BroadcastReceiver,LocalBroadcastReceiver 區別
- AlertDialog,popupWindow,Activity區別
- Application 和 Activity 的 Context 對象的區別
- 如何導入外部數據庫?
- 談談對接口與回調的理解
- 介紹下SurfView
- RecycleView的使用
- 序列化的作用,以及Android兩種序列化的區別
- 差值器
- 估值器
- Android中數據存儲方式
- (二)Android源碼相關分析
- Android動畫框架實現原理
- Android各個版本API的區別
- Requestlayout,onlayout,onDraw,DrawChild區別與聯繫
- invalidate和postInvalidate的區別及使用
- Activity-Window-View三者的差別
- 談談對Volley的理解
- 如何優化自定義View
- 低版本SDK如何實現高版本api?
- 描述一次網絡請求的流程
- HttpUrlConnection 和 okhttp關係
- Bitmap對象的理解
- looper架構
- ActivityThread,AMS,WMS的工作原理
- 自定義View的事件
- AstncTask+HttpClient 與 AsyncHttpClient有什麼區別?
- LaunchMode應用場景
- AsyncTask 如何使用?
- SpareArray原理
- 請介紹下ContentProvider 是如何實現數據共享的?
- AndroidService與Activity之間通信的幾種方式
- IntentService原理及作用是什麼?
- 說說Activity、Intent、Service 是什麼關係
- ApplicationContext和ActivityContext的區別
- SP是進程同步的嗎?有什麼方法做到同步?
- 談談多線程在Android中的使用
- 進程和 Application 的生命週期
- 封裝View的時候怎麼知道view的大小
- RecycleView原理
- AndroidManifest的作用與理解
- (三)常見的一些原理性問題
- Handler機制和底層實現
- Handler、Thread和HandlerThread的差別
- handler發消息給子線程,looper怎麼啓動?
- 關於Handler,在任何地方new Handler 都是什麼線程下?
- ThreadLocal原理,實現及如何保證Local屬性?
- 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係
- 請描述一下View事件傳遞分發機制
- Touch事件傳遞流程
- 事件分發中的onTouch 和onTouchEvent 有什麼區別,又該如何使用?
- View和ViewGroup分別有哪些事件分發相關的回調方法
- View刷新機制
- View繪製流程
- 自定義控件原理
- 自定義View如何提供獲取View屬性的接口?
- Android代碼中實現WAP方式聯網
- AsyncTask機制
- AsyncTask原理及不足
- 如何取消AsyncTask?
- 爲什麼不能在子線程更新UI?
- ANR產生的原因是什麼?
- ANR定位和修正
- 有什麼解決方法可以避免OOM?
- Oom 是否可以try catch?爲什麼?
- 內存泄漏是什麼?
- 什麼情況導致內存泄漏?
- 如何防止線程的內存泄漏?
- 內存泄露場的解決方法
- 內存泄漏和內存溢出區別?
- LruCache默認緩存大小
- ContentProvider的權限管理(解答:讀寫分離,權限控制-精確到表級,URL控制)
- 如何通過廣播攔截和abort一條短信?
- 廣播是否可以請求網絡?
- 計算一個view的嵌套層級
- Activity棧
- Android線程有沒有上限?
- 線程池有沒有上限?
- ListView重用的是什麼?
- (四)開發中常見的一些問題
- ListView 中圖片錯位的問題是如何產生的?
- 混合開發有了解嗎?
- 知道哪些混合開發的方式?說出它們的優缺點和各自使用場景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的瞭解一些前端js等還是很有好處的);
- 服務器只提供數據接收接口,在多線程或多進程條件下,如何保證數據的有序到達?
- 動態佈局的理解
- 怎麼去除重複代碼? 抽象積累,佈局文件,style等。
- Recycleview和ListView的區別
- ListView圖片加載錯亂的原理和解決方案
- 下拉狀態欄是不是影響activity的生命週期:不會。
- 如果在onStop的時候做了網絡請求,onResume的時候怎麼恢復?
- Bitmap 使用時候注意什麼?
- Bitmap的recycler()
- Android中開啓攝像頭的主要步驟
- ViewPager使用細節,如何設置成每次只初始化當前的Fragment,其他的不初始化?
- 點擊事件被攔截,但是想傳到下面的View,如何操作?
- 微信主頁面的實現方式
- 微信上消息小紅點的原理
- CAS介紹(這是阿里巴巴的面試題,我不是很瞭解,可以參考博客: CAS簡介)
- 附;AndroidAPP開發框架技術體系大綱;
- image
- 三、高級開發技術面試題
- 這裏講的是大公司需要用到的一些高端Android技術,這裏專門整理了一個文檔,希望大家都可以看看。這些題目有點技術含量,需要好點時間去研究一下的。
- (一)圖片
- 圖片庫對比
- 圖片庫的源碼分析
- 圖片框架緩存實現
- LRUCache原理
- 圖片加載原理
- 自己去實現圖片庫,怎麼做?
- Glide源碼解析
- Glide使用什麼緩存?
- Glide內存緩存如何控制大小?
- (二)網絡和安全機制
- 網絡框架對比和源碼分析
- 自己去設計網絡請求框架,怎麼做?
- okhttp源碼
- 網絡請求緩存處理,okhttp如何處理網絡緩存的
- 從網絡加載一個10M的圖片,說下注意事項
- TCP的3次握手和四次揮手
- TCP與UDP的區別
- TCP與UDP的應用
- HTTP協議
- HTTP1.0與2.0的區別
- HTTP報文結構
- HTTP與HTTPS的區別以及如何實現安全性
- 如何驗證證書的合法性?
- https中哪裏用了對稱加密,哪裏用了非對稱加密,對加密算法(如RSA)等是否有了解?
- client如何確定自己發送的消息被server收到?
- 談談你對WebSocket的理解
- WebSocket與socket的區別
- 談談你對安卓簽名的理解。
- 請解釋安卓爲啥要加簽名機制?
- 視頻加密傳輸
- App 是如何沙箱化,爲什麼要這麼做?
- 權限管理系統(底層的權限是如何進行 grant 的)?
- (三)數據庫
- sqlite升級,增加字段的語句
- 數據庫框架對比和源碼分析
- 數據庫的優化
- 數據庫數據遷移問題
- (四)算法
- 排序算法有哪些?
- 最快的排序算法是哪個?
- 手寫一個冒泡排序
- 手寫快速排序代碼
- 快速排序的過程、時間複雜度、空間複雜度
- 手寫堆排序
- 堆排序過程、時間複雜度及空間複雜度
- 寫出你所知道的排序算法及時空複雜度,穩定性
- 二叉樹給出根節點和目標節點,找出從根節點到目標節點的路徑
- 給阿里2萬多名員工按年齡排序應該選擇哪個算法?
- GC算法(各種算法的優缺點以及應用場景)
- 蟻羣算法與蒙特卡洛算法
- 子串包含問題(KMP 算法)寫代碼實現
- 一個無序,不重複數組,輸出N個元素,使得N個元素的和相加爲M,給出時間複雜度、空間複雜度。手寫算法
- 萬億級別的兩個URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應用層面對尋址的優化)
- 百度POI中如何試下查找最近的商家功能(提示:座標鏡像+R樹)。
- 兩個不重複的數組集合中,求共同的元素。
- 兩個不重複的數組集合中,這兩個集合都是海量數據,內存中放不下,怎麼求共同的元素?
- 一個文件中有100萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件中。說出最優的方法
- 一張Bitmap所佔內存以及內存佔用的計算
- 2000萬個整數,找出第五十大的數字?
- 燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
- 求1000以內的水仙花數以及40億以內的水仙花數
- 5枚硬幣,2正3反如何劃分爲兩堆然後通過翻轉讓兩堆中正面向上的硬8幣和反面向上的硬幣個數相同
- 時針走一圈,時針分針重合幾次
- N*N的方格紙,裏面有多少個正方形
- x個蘋果,一天只能吃一個、兩個、或者三個,問多少天可以吃完?
- (五)插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 對熱修復和插件化的理解
- 插件化原理分析
- 模塊化實現(好處,原因)
- 熱修復,插件化
- 項目組件化的理解
- 描述清點擊 Android Studio 的 build 按鈕後發生了什麼
- (六)架構設計和設計模式
- 談談你對Android設計模式的理解
- MVC MVP MVVM原理和區別
- 你所知道的設計模式有哪些?
- 項目中常用的設計模式
- 手寫生產者/消費者模式
- 寫出觀察者模式的代碼
- 適配器模式,裝飾者模式,外觀模式的異同?
- 用到的一些開源框架,介紹一個看過源碼的,內部實現過程。
- 談談對RxJava的理解
- RxJava的功能與原理實現
- RxJava的作用,與平時使用的異步操作來比的優缺點
- 說說EventBus作用,實現方式,代替EventBus的方式
- 從0設計一款App整體架構,如何去做?
- 說一款你認爲當前比較火的應用並設計(比如:直播APP,P2P金融,小視頻等)
- 談談對java狀態機理解
- Fragment如果在Adapter中使用應該如何解耦?
- Binder機制及底層實現
- 對於應用更新這塊是如何做的?(解答:灰度,強制更新,分區域更新)?
- 實現一個Json解析器(可以通過正則提高速度)
- 統計啓動時長,標準
- (七)性能優化
- 如何對Android 應用進行性能分析以及優化?
- ddms 和 traceView
- 性能優化如何分析systrace?
- 用IDE如何分析內存泄漏?
- Java多線程引發的性能問題,怎麼解決?
- 啓動頁白屏及黑屏解決?
- 啓動太慢怎麼解決?
- 怎麼保證應用啓動不卡頓?
- App啓動崩潰異常捕捉
- 自定義View注意事項
- 現在下載速度很慢,試從網絡協議的角度分析原因,並優化(提示:網絡的5層都可以涉及)。
- Https請求慢的解決辦法(提示:DNS,攜帶數據,直接訪問IP)
- 如何保持應用的穩定性
- RecyclerView和ListView的性能對比
- ListView的優化
- RecycleView優化
- View渲染
- Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
- java中的四種引用的區別以及使用場景
- 強引用置爲null,會不會被回收?
- (八)NDK、jni、Binder、AIDL、進程通信有關
- 請介紹一下NDK
- 什麼是NDK庫?
- jni用過嗎?
- 如何在jni中註冊native函數,有幾種註冊方式?
- Java如何調用c、c++語言?
- jni如何調用java層代碼?
- 進程間通信的方式?
- Binder機制
- 簡述IPC?
- 什麼是AIDL?
- AIDL解決了什麼問題?
- AIDL如何使用?
- Android 上的 Inter-Process-Communication 跨進程通信時如何工作的?
- 多進程場景遇見過麼?
- Android進程分類?
- 進程和 Application 的生命週期?
- 進程調度
- 談談對進程共享和線程安全的認識
- 談談對多進程開發的理解以及多進程應用場景
- 什麼是協程?
- (九)framework層、ROM定製、Ubuntu、Linux之類的問題
- java虛擬機的特性
- 談談對jvm的理解
- JVM內存區域,開線程影響哪塊內存
- 對Dalvik、ART虛擬機有什麼瞭解?
- Art和Dalvik對比
- 虛擬機原理,如何自己設計一個虛擬機(內存管理,類加載,雙親委派)
- 談談你對雙親委派模型理解
- JVM內存模型,內存區域
- 類加載機制
- 談談對ClassLoader(類加載器)的理解
- 談談對動態加載(OSGI)的理解
- 內存對象的循環引用及避免
- 內存回收機制、GC回收策略、GC原理時機以及GC對象
- 垃圾回收機制與調用System.gc()區別
- Ubuntu編譯安卓系統
- 系統啓動流程是什麼?(提示:Zygote進程 –> SystemServer進程 –> 各種系統服務 –> 應用進程)
- 大體說清一個應用程序安裝到手機上時發生了什麼
- 簡述Activity啓動全部過程
- App啓動流程,從點擊桌面開始
- 邏輯地址與物理地址,爲什麼使用邏輯地址?
- Android爲每個應用程序分配的內存大小是多少?
- Android中進程內存的分配,能不能自己分配定額內存?
- 進程保活的方式
- 如何保證一個後臺服務不被殺死?(相同問題:如何保證service在後臺不被kill?)比較省電的方式是什麼?
- App中喚醒其他進程的實現方式
- 附;性能調優+前沿技術+NDK技術大綱
- image
- 四、跨平臺Hybrid 開發
- flutter
- Html5項目實戰
- HTML&CSS&JavaScript 實戰
- WordPress搭建網站項目實戰
- 前端Vue架構
- 前端樣式開發
- Weex內置能力
- Weex原生應用
- Weex擴展框架
- WeexUI架構
- 介紹你做過的哪些項目
- 都使用過哪些框架、平臺?
- 都使用過哪些自定義控件?
- 研究比較深入的領域有哪些?
- 對業內信息的關注渠道有哪些?
- 最近都讀哪些書?
- 有沒有什麼開源項目?
- 自己最擅長的技術點,最感興趣的技術領域和技術點
- 項目中用了哪些開源庫,如何避免因爲引入開源庫而導致的安全性和穩定性問題
- 實習過程中做了什麼,有什麼產出?
- 附;跨平臺Hybrid 開發技術大綱
- 作者:Android高級架構
- 鏈接:https://www.jianshu.com/p/e6702d61eec9
- 來源:簡書
- 簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。