數據結構和算法類
順序表和鏈表的區別?
順序表隨機訪問快,插入刪除慢;鏈表插入刪除快,隨機訪問慢。
棧和隊列的區別?
棧:先進後出,隊列:先進先出
常用的排序算法有哪些?
冒泡排序、選擇排序、快速排序、堆排序等。
快速排序的實現思想是怎樣?快速排序的時間複雜度是多少?
- 劃分,在待排序的數列中隨機選擇一個x,然後通過比較最終確定它在數列中的最終位置。這個數將原數列分成三部分:比x小的數、x、比x大的數。
- 在“比x小的數”和“比x大的數”中遞歸使用1的方法進行劃分。直到每一個數都確定最終位置。
- 因爲是不斷地折半,所以時間複雜度是O(Log2 N)
冒泡排序的時間複雜度是多少?
O(n^2)
堆排序的原理是怎樣?
- 需要先解釋堆這種數據結構(完全二叉樹),對每個非葉子節點,都有:左孩子比父節點小,右節點比父節點大。
- 將堆調整爲大根堆或者小根堆的過程。
- 時間複雜度是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等。說自己理解的,不要給自己挖坑。面試官會繼續問實現和使用的。
- 觀察者模式可參考Android源碼中的觀察者模式
- 裝飾者模式可參考理解裝飾者模式
單例模式的缺點是什麼?
- 單例模式在Android中生命週期較長,如果單例持有activity的引用,容易引發內存泄露問題。比如將登錄模塊的所有動作封裝成的單例LoginBiz。
- 找到一篇博客單例模式優缺點
工廠模式有哪幾種?簡單工廠模式和工廠方法模式的區別是什麼?
簡單工廠模式、工廠方法模式、抽象工廠模式
適配者模式有哪幾種?
靜態代理和動態代理的區別是什麼?
- 根據代理類的生成時間不同分爲靜態代理和動態代理。
- 靜態代理:由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。
- 動態代理類:在程序運行時,運用反射機制動態創建而成。
Java基礎類
什麼是多態?多態的實現機制/原理是什麼?
- 在面嚮對象語言中,接口的多種不同的實現方式即爲多態。
- 父類的指針可以指向子類的對象
- 多態性在C++中都是通過虛函數實現的
- 多態的實現基礎是動態綁定。
HashCode相等的兩個對象是否一定equals?
否
如果對象equals 是true,hashCode需要相同;但是hashCode相同的對象不一定equals。因爲:- hashCode方法可以被重載,可能導致不同的對象擁有相同的哈希值。
- Java中的hash函數返回的是int類型,最多允許存在2^32個,是有限的,所以兩個不同的對象有可能恰好擁有相同的哈希值
一個對象什麼時候會被垃圾回收器回收?
內存不足,且這個對象GC Root不可達時
Java虛擬機中的內存分哪幾個區?GC垃圾回收機制是怎樣的?
方法區、棧、堆、本地方法區等。
內存泄露和內存溢出的區別和聯繫?
內存泄露:本該釋放的內存沒有釋放,並且自己也無法訪問了。
內存溢出:申請的內存大於系統剩餘可分配的內存。精滿自溢。
內存泄露容易引發內存溢出。怎樣解決併發問題?有哪些關鍵字?2個線程間的併發問題和10個線程間的併發問題複雜度是否一樣?
synchronize,volatile
線程越多,等待資源的問題越嚴重。什麼是死鎖?
是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。
Concurrent包中有哪些類?
- BlockingQueue接口
- ArrayBlockingQueue
- DelayQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- SynchronousQueue
- ConcurrentMap
- ConcurrentHashMap
- ExecutorService接口
- ThreadPoolExecutor
- ScheduledExecutorService
- 可參考老外的博客系列Java Concurrency Utilities以及中文翻譯 Java 併發工具包 java.util.concurrent 用戶指南
- BlockingQueue接口
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-HashSetMap
├Hashtable
├HashMapCollection和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原理
看版本
上帝視角類
- 什麼是64k問題?爲什麼有這個問題?
- 是否隨時關注着Google在Android方面的新動向?
- Android5.0以後有哪些新特性?
- 對Android的前景怎麼看?你個人的近期(一年)規劃是怎樣?
- 有沒有開源過項目?
- 對各種開源組件怎麼技術選型?
- APP如何調優?
怎樣設計Android和iOS統一的接口,屏蔽掉Context,因爲iOS中沒有Context。
面試者可能想聽到的回答是Hybrid開發。
請舉一個你實際解決問題的實例。
- 生產環境和測試環境頻繁切換,需要重新打包。在App中增加後門,可配置環境。
計算機專業基礎、學歷、英語(直接閱讀英文技術文檔的能力)、學習能力(從Java迅速轉Android、有從0到1的項目經歷)等
有可能是他們實際開發中無法解決的問題拿出來考面試者