前言
前幾年移動互聯網創業的風口,如今漸漸消失,移動互聯網被巨頭公司瓜分,一些創業公司倒閉了,Android?開發需求慢慢趨近于飽和。而當初移動互聯網處于風口時,自學、轉行以及培訓機構出來了大量 Android 開發從業者,導致目前看起來市場供大于求。
那么?Android?開發工程師們應該如何面對當下的局面呢?
其實當下的供需關系不平衡不代表沒有需求,市場上過多的是只會寫 xml 和 Activity、只會用代碼堆需求的初級 Android?程序員,而高級?Android?開發工程師仍然緊缺,并且薪資很可觀。
那么接下來,問題就變成了“如何提升自己在?Android?市場上的競爭力”。
(一) java基礎面試知識點
- java中==和equals和hashCode的區別
- int、char、long各占多少字節數
- int與integer的區別
- 談談對java多態的理解
- String、StringBuffer、StringBuilder區別
- 什么是內部類?內部類的作用
- 抽象類和接口區別同樣體育部
- 抽象類的意義
- 抽象類與接口的應用場景
- 抽象類是否可以沒有方法和屬性?
- 接口的意義
- 泛型中extends和super的區別
- 父類的靜態方法能否被子類重寫
- 進程和線程的區別
- final,finally,finalize的區別
- 序列化的方式
- Serializable 和Parcelable 的區別
- 靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
- 靜態內部類的設計意圖
- 成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用
- 談談對kotlin的理解
- 閉包和局部內部類的區別
- string 轉換成 integer的方式及原理
(二) java深入源碼級的面試題(有難度)
- 哪些情況下的對象會被垃圾回收機制處理掉?
- 講一下常見編碼方式?
- utf-8編碼中的中文占幾個字節;int型幾個字節?
- 靜態代理和動態代理的區別,什么場景使用?
- Java的異常體系
- 談談你對解析與分派的認識。
- 修改對象A的equals方法的簽名,那么使用HashMap存放這個對象實例的時候,會調用哪個equals方法?
- Java中實現多態的機制是什么?
- 如何將一個Java對象序列化到文件里?
- 說說你對Java反射的理解
- 說說你對Java注解的理解
- 說說你對依賴注入的理解
- 說一下泛型原理,并舉例說明
- Java中String的了解
- String為什么要設計成不可變的?
- Object類的equal和hashCode方法重寫,為什么?
(三) 數據結構
- 常用數據結構簡介
- 并發集合了解哪些?
- 列舉java的集合以及集合之間的繼承關系
- 集合類以及集合框架
- 容器類介紹以及之間的區別(容器類估計很多人沒聽這個詞,Java容器主要可以劃分為4個部分:List列表、Set集合、Map映射、工具類(Iterator迭代器、Enumeration枚舉類、Arrays和Collections))
- List,Set,Map的區別
- List和Map的實現方式以及存儲方式
- HashMap的實現原理
- HashMap數據結構?
- HashMap源碼理解
- HashMap如何put數據(從HashMap源碼角度講解)?
- HashMap怎么手寫實現?
- ConcurrentHashMap的實現原理
- ArrayMap和HashMap的對比
- HashTable實現原理
- TreeMap具體實現
- HashMap和HashTable的區別
- HashMap與HashSet的區別
- HashSet與HashMap怎么判斷集合元素重復?
- 集合Set實現Hash怎么防止碰撞
- ArrayList和LinkedList的區別,以及應用場景
- 數組和鏈表的區別
- 二叉樹的深度優先遍歷和廣度優先遍歷的具體實現
- 堆的結構
- 堆和樹的區別
- 堆和棧在內存中的區別是什么(解答提示:可以從數據結構方面以及實際實現方面兩個方面去回答)?
- 什么是深拷貝和淺拷貝
- 手寫鏈表逆序代碼
- 講一下對樹,B+樹的理解
- 講一下對圖的理解
- 判斷單鏈表成環與否?
- 鏈表翻轉(即:翻轉一個單項鏈表)
- 合并多個單有序鏈表(假設都是遞增的)
(四) 線程、多線程和線程池
- 開啟線程的三種方式?
- 線程和進程的區別?
- 為什么要有線程,而不是僅僅用進程?
- run()和start()方法區別
- 如何控制某個方法允許并發訪問線程的個數?
- 在Java中wait和seelp方法的不同;
- 談談wait/notify關鍵字的理解
- 什么導致線程阻塞?
- 線程如何關閉?
- 講一下java中的同步的方法
- 數據一致性如何保證?
- 如何保證線程安全?
- 如何實現線程同步?
- 兩個進程同時要求寫或者讀,能不能實現?如何防止進程的同步?
- 線程間操作List
- Java中對象的生命周期
- Synchronized用法
- synchronize的原理
- 談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解
- static synchronized 方法的多線程訪問和作用
- 同一個類里面兩個synchronized方法,兩個線程同時訪問的問題
- volatile的原理
- 談談volatile關鍵字的用法
- 談談volatile關鍵字的作用
- 談談NIO的理解
- synchronized 和volatile 關鍵字的區別
- synchronized與Lock的區別
- ReentrantLock 、synchronized和volatile比較
- ReentrantLock的內部實現
- lock原理
- 死鎖的四個必要條件?
- 怎么避免死鎖?
- 對象鎖和類鎖是否會互相影響?
- 什么是線程池,如何使用?
- Java的并發、多線程、線程模型
- 談談對多線程的理解
- 多線程有什么要注意的問題?
- 談談你對并發編程的理解并舉例說明
- 談談你對多線程同步機制的理解?
- 如何保證多線程讀寫文件的安全?
- 多線程斷點續傳原理
- 斷點續傳的實現
一)Android基礎知識點
- 四大組件是什么
- 四大組件的生命周期和簡單用法
- Activity之間的通信方式
- Activity各種情況下的生命周期
- 橫豎屏切換的時候,Activity 各種情況下的生命周期
- Activity與Fragment之間生命周期比較
- Activity上有Dialog的時候按Home鍵時的生命周期
- 兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
- 前臺切換到后臺,然后再回到前臺,Activity生命周期回調方法。彈出Dialog,生命值周期回調方法。
- Activity的四種啟動模式對比
- Activity狀態保存于恢復
- fragment各種情況下的生命周期
- Fragment狀態保存startActivityForResult是哪個類的方法,在什么情況下使用?
- 如何實現Fragment的滑動?
- fragment之間傳遞數據的方式?
- Activity 怎么和Service 綁定?
- 怎么在Activity 中啟動自己對應的Service?
- service和activity怎么進行數據交互?
- Service的開啟方式
- 請描述一下Service 的生命周期
- 談談你對ContentProvider的理解
- 說說ContentProvider、ContentResolver、ContentObserver 之間的關系
- 請描述一下廣播BroadcastReceiver的理解
- 廣播的分類
- 廣播使用的方式和場景
- 在manifest 和代碼中如何注冊和使用BroadcastReceiver?
- 本地廣播和全局廣播有什么差別?
- BroadcastReceiver,LocalBroadcastReceiver 區別
- AlertDialog,popupWindow,Activity區別
- Application 和 Activity 的 Context 對象的區別
- Android屬性動畫特性
- 如何導入外部數據庫?
- LinearLayout、RelativeLayout、FrameLayout的特性及對比,并介紹使用場景。
- 談談對接口與回調的理解
- 回調的原理
- 寫一個回調demo
- 介紹下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如何考慮機型適配
- 自定義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?
- 有什么解決方法可以避免OOM?
- Oom 是否可以try catch?為什么?
- 內存泄漏是什么?
- 什么情況導致內存泄漏?
- 如何防止線程的內存泄漏?
- 內存泄露場的解決方法
- 內存泄漏和內存溢出區別?
- LruCache默認緩存大小
- ContentProvider的權限管理(解答:讀寫分離,權限控制-精確到表級,URL控制)
- 如何通過廣播攔截和abort一條短信?
- 廣播是否可以請求網絡?
- 廣播引起anr的時間限制是多少?
- 計算一個view的嵌套層級
- Activity棧
- Android線程有沒有上限?
- 線程池有沒有上限?
- ListView重用的是什么?
- Android為什么引入Parcelable?
- 有沒有嘗試簡化Parcelable的使用?
(四)開發中常見的一些問題
-
ListView 中圖片錯位的問題是如何產生的?
-
混合開發有了解嗎?
-
知道哪些混合開發的方式?說出它們的優缺點和各自使用場景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的了解一些前端js等還是很有好處的);
-
屏幕適配的處理技巧都有哪些?
-
服務器只提供數據接收接口,在多線程或多進程條件下,如何保證數據的有序到達?
-
動態布局的理解
-
怎么去除重復代碼?
-
畫出 Android 的大體架構圖
-
Recycleview和ListView的區別
-
ListView圖片加載錯亂的原理和解決方案
-
動態權限適配方案,權限組的概念
-
Android系統為什么會設計ContentProvider?
-
下拉狀態欄是不是影響activity的生命周期
-
如果在onStop的時候做了網絡請求,onResume的時候怎么恢復?
-
Bitmap 使用時候注意什么?
-
Bitmap的recycler()
-
Android中開啟攝像頭的主要步驟
-
ViewPager使用細節,如何設置成每次只初始化當前的Fragment,其他的不初始化?
-
點擊事件被攔截,但是想傳到下面的View,如何操作?
-
微信主頁面的實現方式
-
微信上消息小紅點的原理
-
CAS介紹
三、混合開發面試題
大廠除了技術深度之外,還要求你具備一些廣度的知識,比如你要會前端知識,會混合開發,至少會一種腳本語言,C c++更不用說了,也是必會的。
- Hybrid做過嗎?
- Hybrid通信原理是什么,有做研究嗎?
- react native有多少了解?講一下原理。
- weex了解嗎?如何自己實現類似技術?
- flutter了解嗎?內部是如何實現跨平臺的?
- Dart語言有研究貴嗎?
- 快應用了解嗎?跟其她方式相比有什么優缺點?
- 說說你用過的混合開發技術有哪些?各有什么優缺點?
- Python會嗎?
- 會不會PHP?
- Gradle了解多少?groovy語法會嗎?