逛 Github 的時候看到一份超強面試題,來自 MindOrks 開源的 android-interview-questions。雖說是一份安卓面試題,但其中包含了 資料結構與演算法
、Java 核心基礎
、Android 核心基礎
、設計模式
等各方面內容。大致瀏覽了一下,質量還不錯,比百度出來的各種所謂 BAT 面試題
強一些。也看到國內一些開發者有做翻譯,比如 stormzhang
發起的 android-interview-questions-cn。可能由於種種原因,未能完成全部工作,且題目也已經更新了很多。
出於複習的目的吧,正好也在寫 走進 JDK
系列的文章(可以看看我的專欄),就打算把這些題目都捋一遍,儘可能帶來高質量的答案,估計會花費不短時間。今天這篇文章先把所有題目整理出來,後面會陸續配上答案。
拉到文末直接獲取所有題目 pdf 檔案 。
Core Java
物件導向
1. 什麼是 OOP ?
2. 抽象類和介面的區別 ?
3. Iterator 和 Enumeration 的區別 ?
4. 你同意 組合優先於繼承 嗎 ?
5. 方法過載和方法重寫的區別 ?
6. 你知道哪些訪問修飾符 ? 它們分別的作用 ?
7. 一個介面可以實現另一個介面嗎 ?
8. 什麼是多型 ?什麼是繼承 ?
9. Java 中類和介面的多繼承
10. 什麼是設計模式?
集合和泛型
11. Arrays vs ArrayLists
12. HashSet vs TreeSet
13. HashMap vs HashSet
14. Stack vs Queue
15. 解釋 java 中的泛型
16. String 類是如何實現的?它為什麼被設計成不可變類 ?
物件和基本型別
16. String 類是如何實現的?它為什麼被設計成不可變類 ?
17. 為什麼說 String 不可變 ?
18. 什麼是 String.intern() ? 何時使用? 為什麼使用 ?
19. 列舉 8 種基本型別
20. int 和 Integer 區別
21. 什麼是自動裝箱拆箱 ?
22. Java 中的型別轉換
23. Java 值傳遞還是引用傳遞 ?
24. 物件例項化和初始化之間的區別 ?
25. 區域性變數、例項變數以及類變數之間的區別?
Java 記憶體模型和垃圾收集器
26. 什麼是垃圾收集器 ? 它是如何工作的 ?
27. 什麼是 java 記憶體模型? 它遵循了什麼原則?它的堆疊是如何組織的 ?
28. 什麼是 記憶體洩漏,java 如何處理它 ?
29. 什麼是 強引用,軟引用,弱引用,虛引用 ?
併發
30. 關鍵字 synchronized 的作用 ?
31. ThreadPoolExecutor 作用 ?
32. 關鍵字 volatile 的作用 ?
33. The clasess in the atomic package expose a common set of methods: get, set,, lazyset, compareAndSet, and weakCompareAndSet. Please describe them.
異常
34. try{} catch{} finally{} 是如何工作的 ?
35. Checked Exception 和 Un-Checked Exception 區別 ?
其他
36. 什麼是序列化?如何實現 ?
37. 關鍵字 transient 的作用 ?
38. 什麼是匿名內部類 ?
39. 物件的 == 和 .equals 區別 ?
40. hashCode() 和 equals() 用處 ?
41. 建構函式中為什麼不能呼叫抽象方法 ?
42. 你什麼時候會使用 final 關鍵字 ?
43. final, finally 和 finalize 的區別 ?
44. Java 中 static 關鍵字的含義 ?
45. 靜態方法可以重寫嗎 ?
46. 靜態程式碼塊如何執行 ?
47. 什麼是反射 ?
48. 什麼是依賴注入 ?列舉幾個庫 ?你使用過嗎 ?
49. StringBuilder 如何避免不可變類 String 的分配問題?
50. StringBuffer 和 StringBuilder 區別 ?
51. Enumeration and an Iterator 區別 ?
52. fail-fast and fail-safe 區別 ?
53. 什麼是 NIO ?
Core Android
Base
54. Android 應用元件
55. Android 應用架構
56. 什麼是 Context?
57. 什麼是 AndroidManifest.xml?
58. 什麼是 Application ?
Activity
59. 什麼是 Activity ?
60. 說明一下 Activity 和 Fragment 的生命週期
61. 什麼是 Activity 的啟動模式 ?
Fragments
62. 什麼是 Fragment ?
63. Activity 和 Fragment 關係和區別 ?
64. 為什麼建議使用預設建構函式來建立 Fragment ?
65. Fragment 之間如何通訊 ?
66. 什麼是 Retained Fragment ?
View 和 ViewGroup
67. 在 Android 中,什麼是 View ?
68. View.GONE 和 View.INVISIBLE 的區別 ?
69. 如何建立自定義 View ?
70. 什麼是 ViewGroups 以及和 View 的區別 ?
71. 什麼是 canvas ?
72. 什麼是 SurfaceView ?
73. 相對佈局和線性佈局對比
74. 談談 Constraint Layout
75. 你知道 View 樹嗎 ?如何優化它的深度 ?
展示內容集合
76. ListView 和 RecyclerView 區別 ?
77. 什麼是 ViewHolder ?為什麼使用它 ?
78. 什麼是 SnapHelper ?
Dialog 和 Toast
79. 什麼是 Dialog ?
80. 什麼是 Toast ?
81. Dialog 和 Dialog Fragment 區別 ?
Intent 和 廣播
82. 什麼是 Intent ?
83. 什麼是 顯示 Intent ?
84. 什麼是 隱式 Intent ?
85. 什麼是 BroadcastReceiver ?
86. 什麼是 LocalBroadcastReceiver ?
87. IntentFilter 的作用 ?
88. 什麼是 sticky intent ?
89. 說說廣播和 Intent 是如何在你的應用中傳遞訊息的 ?
90. 什麼是 PendingIntent ?
91. 廣播的不同型別 ?
Services
92. 什麼是 Service ?
93. Service 和 IntentService
94. 什麼是 JobSchedule ?
Inter-process Communication
95. 兩個不同的 app 如何通訊 ?
96. 一個 app 可以多程式執行嗎 ?如何實現 ?
97. 什麼是 AIDL ? 列舉實現步驟。
98. 你可以使用後臺程式幹什麼 ?
99. 什麼是 ContentProvider ?一般用來幹什麼 ?
Long-running Operations
100. 如何進行耗時任務 ?
101. 為什麼要避免在主執行緒執行非ui程式碼 ?
102. 什麼是 ANR ?如何預防 ?
103. 什麼是 AsyncTask ?
104. AsyncTask 有哪些問題 ?
105. 你會在什麼時候使用 AsyncTask 代替執行緒 ?
106. 什麼是 Loader ?
107. AsyncTask 和 Activity 的生命週期有什麼聯絡 ?會導致什麼問題 ?如何避免 ?
108. 解釋 Looper, Handler 和 HandlerThread 的作用
多媒體
109. 如何處理 Bitmap 佔據大量記憶體 ?
110. 一個標準的 Bitmap 和一個 .9 圖的區別 ?
111. 談談 Bitmap pool
112. Android 中如何播放聲音 ?
Data Saving
113. 如何持久化資料 ?
114. 什麼是 ORM ?它如何工作 ?
115. 螢幕旋轉時如何儲存 Activity 狀態 ?
116. 你的應用中儲存資料的不同方式 ?
Look and feel
117. 什麼是 Spannable ?
記憶體優化
118. 什麼是 onTrimMemory() 方法 ?
119. OutOfMemory 是如何發生的 ?
120. 在 Android 中你是如何找到記憶體洩漏的 ?
電量優化
121. 在 Android 中如何降低電量消耗 ?
122. 什麼是 Doze ?應用支援如何 ?
123. 什麼是過度繪製 ?
Supporting Different Screen Sizes
124. 你是如何進行螢幕適配的 ?
Permissions
125. 許可權中有哪些不同的保護級別 ?
Native Programming
126. 什麼是 NDK ,它的作用是什麼 ?
127. 什麼是 renderscript ?
Android System Internal
128. 什麼是 Dalvik Virtual Machine ?
129. JVM, DVM 和 ART 區別
130. Dalvik 和 ART 區別
131. 什麼是 Dex?
132. 你可以手動呼叫垃圾回收嗎 ?
Debugging and Programming Tools
133. 什麼是 ADB ?
134. 什麼是 DDMS ?你可以用它幹什麼 ?
135. 什麼是 StrictMode ?
136. 什麼是 lint ? 它的作用是什麼 ?
Others
137. 為什麼使用 Bundle 傳遞資料 ? 為什麼不使用 Map ?
138. 你是如何解決應用中的 crash 的 ?
139. 說說 Android 通知 體系
140. Serializable 和 Parcelable 區別 ? Android 中使用哪個更好 ?
141. 開發過 widgets 嗎 ?
142. 什麼是 AAPT ?
143. 定時重新整理頁面的最好方法是什麼 ?
144. FlatBuffers 和 JSON
145. HashMap, ArrayMap 和 SparseArray
146. 什麼是註解 ?
147. android 中如何處理 multi-touch ?
148. 如何實現 XML 名稱空間 ?
149. 什麼是 support library ?以及為什麼引入 ?
150. 什麼是 Android Data Binding ?
151. 什麼是 Android Architecture Components ?
152. 如何使用 RxJava 操作符實現查詢 ?
架構
153. 描述一下你最近開發的 App 使用的架構
154. 說說 MVP
155. 什麼是 Presenter ?
156. 什麼是 Model ?
157. 說說 MVC
158. 說說 MVI
159. 說說 Repository pattern
160. 什麼是 Controller ?
161. Tell something about clean code
Android 測試驅動開發
162. 什麼是 Espresso ?
163. 什麼是 Robolectric ?
164. 使用 Robolectric 的缺點是什麼 ?
165. 什麼是 UI-Automator ?
166. 說說單元測試
167. 說說自動化測試
168. 你進行過單元測試或者自動化測試嗎 ?
169. 為什麼使用 Mockito ?
其他
170. 什麼是 Android Jetpack ?
171. 說說 REST APIs 如何工作的
172. 說說其他的 Web Api 架構
173. 說說資料庫,Sqlite
174. 關於專案管理工具,trello, basecamp, kanban, jira, asana
175. 關於構建系統, gradle, maven, ant, buck
176. 應用多 Apk 檔案
177. 反編譯 Apk
178. ProGuard 被用來做什麼 ?
179. 什麼是混淆 ? 它的作用是什麼 ? minification 呢 ?
180. 你如何構建 release 安裝包 ?
181. 你如何控制對於特定使用者的版本更新 ?
182. 我們可以找出已經解除安裝我們的應用的使用者嗎 ?
183. Apk 檔案大小優化
184. 你嘗試過 Kotlin 嗎 ?
185. 在開發過程中如何持續監測各種指標 ?
186. 什麼是 Chrome Custom Tabs ? 如何在你的 app 中展示網頁內容 ?
資料結構這塊的題目不是很詳細,就沒有加上來。其他的根據實際情況作了部分刪減,共計 186 題。
微信搜尋
秉心說
,或者掃碼下列二維碼關注公眾號,回覆面試題
即可獲取所有題目
文章首發於微信公眾號:
秉心說
, 專注 Java 、 Android 原創知識分享,JDK 、AOSP 原始碼解析,LeetCode 題解,歡迎掃碼關注 !