最近剛換了工作,在這裏把各互聯網公司問到的題目做下總結。涉及的內容都是Android研發應該掌握的基礎問題,我把題目大概分爲JAVA,設計模式,Android,網絡,算法五類。最後邊列一下自己看過的技術書籍,希望大家都能提高自己,找到心儀的工作。
JAVA篇
JAVA內存回收機制
需要了解引用計數法,可達性分析法。
需要知道標記清除,標記複製,標記整理。
JVM分代回收算法流程。
Java7的的新垃圾回收器。
詳細可以去看《深入理解JAVA虛擬機》這本書JAVA中的引用,強引用,軟引用,弱引用,虛引用
能說清各個引用的意思,瞭解ReferenceQueue,square公司的LeakCanary框架,MAT工具等。final關鍵字使用場景
修飾類,修飾方法,修飾變量的意義static關鍵字使用場景
修飾類,修飾變量,修飾方法,靜態塊,靜態導入。集合類相關
ArrayList,LinkedList,HashMap,TreeMap等內部實現原理。
ArrayList與LinkedList區別,ArrayList與Vector的區別,HashMap與HashTable區別。內部類,靜態內部類,局部內部類簡介,及內部類爲什麼默認持有外部類的引用
JAVA編譯器會在內部類中加入類型爲外部類的成員變量,並提供相關參數的構造函數JAVA中如何實現多繼承
通過實現多個接口及內部類的方式線程池相關
搞清Executor,ExecutorService,ThreadPoolExecutor關係。ThreadPoolExecutor中的參數使用。可以結合Executors工具類的newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool等方法說一說
簡述下線程池原理,當時沒看過源碼,結合Volley中自己實現的線程池說了說,主要涉及到BlockingQueue,核心線程,最大線程等概念,需要多看源碼JAVA線程的幾種狀態,如何終止線程,進程與線程的區別。
創建,就緒,運行,阻塞(同步塊,IO阻塞),主動睡眠,主動等待,銷燬。JAVA的wait,notify,notifyAll的用法,wait與sleep的區別
wait掛起當前線程,等待sychronized的對象,notify喚醒一個wait的線程,notifyAll喚醒所有wait的線程。wait後線程會放棄鎖,sleep會持有鎖。什麼是線程安全,如何保證線程安全
JAVA的concurrent中的一些類,JAVA的鎖
一些原子操作類,一些併發操作的集合類,一些更靈活的鎖JAVA併發內存模型,三大特性(原子性,可見性,有序性),volatile,synchronized關鍵字
注意volatile的作用使用場景,原理,什麼是多態,多態的使用場景,使用多態的意義
switch中可以使用的類型
int,byte,short,char,枚舉,JAVA7以上String,case後必須final的變量JAVA的ClassLoader,雙親委派
判斷一個類是否相同,類加載器與類全名稱都得相同,優先委託父類加載器來加載類JAVA對象的初始化順序
加載類
初始化父類靜態變量
執行父類靜態塊
初始化子類靜態變量
執行子類靜態塊
初始化父類成員變量
執行父類構造函數
初始化子類成員變量
執行子類構造函數try,catch,finally執行順序,finalize的調用時機,作用。
JAVA的異常
都實現Throwable接口,分Error,Exception兩類instanceof與getClass的區別
object是否可以強轉爲某類型,可以用instanceof判斷。getClass獲得即某對象的Class對象Iterator,foreach,for,效率與線程安全
Iterator迭代器可以在迭代過程中調用remove方法,做移除操作。foreach類似於迭代器,缺陷是不能移除,會出現併發異常。for過程中可以移除操作,注意一個問題索引問題。String,StringBuilder,StringBuffer
object類中都有什麼方法,重寫equals方法也要重寫hashcode方法。
long是否可以移位操作
設計模式篇
面向對象的六大原則
單一職責原則
里氏替換原則
依賴倒置原則
接口隔離原則
開閉原則
迪米特原則單例模式,最常被要求手寫的設計模式
一般寫懶漢式:雙重判斷的寫法(使用了volatile關鍵字,由於禁用指令重排優化,有一定的性能損耗),內部靜態類寫法(利用了JAVA類加載機制保證了線程安全),枚舉寫法(簡單逼格高,出現在effective java中,支持序列化),最好能說出他們的各種優勢缺點觀察者模式
工廠模式:簡單工廠,工廠方法,抽象工廠
代理模式(代理模式的意義與作用)
裝飾模式(Context,JAVA的流相關類,裝飾模式與代理模式區別)
組合模式(Android的View與ViewGroup)
建造者模式(AlertDialog)
上述只是列出了幾個簡單常用的,還有其他自己應用過的設計模式(創建型,結構型,行爲型),最好結合自己的項目說一說,或者結合Android源碼講講,推薦書籍《Head First Design Pattern》《Android源碼設計模式解析與實戰》
MVP,MVC,MVVM等等,結合自己的項目講講。
Android篇
消息機制
- Handler,Looper,Message原理(幾乎所有技術面都會問到,最好詳細閱讀下源碼,能講清各個類的關係,他的消息處理流程,最好詳細看懂MessageQueue的next 方法,瞭解native層的消息機制。epoll機制等等,我自己閱讀源碼的分析(寫的不好請大家多多包涵)http://blog.csdn.net/industriously/article/details/50933315)
- 被問到的幾個Handler的問題:Activity內部Handler是否可以創建多個,Looper會把消息發給哪個Handler;子線程是否可以直接創建Handler,可以瞭解下HandlerThread與IntentService這兩個類;
- Message隊列是個鏈表,插入刪除如何保證線程安全,非線程安全會出現什麼後果,畫圖描述下;Message.obtain()爲啥效率高。
Activity生命週期(onSaveInstanceState 的調用時機,onWindowFocusChange調用時機,onConfigurationChanged)
Activity的四中啓動模式,與onNewIntent回調
Fragment生命週期(結合實際例子分析)
Fragment與Activity通信
Fragment使用中踩過的坑
(必須有一個參數爲空的public構造函數,getActivity()空指針,與viewPager使用生命週期函數不會被調用,show,hide方法在被回收後恢復的fragment重疊問題等等,純fragment架構坑比較多)Service的生命週期(start,bind兩種)
Service的onStartCommand方法的返回值,及其意義(START_STICKY,START_NO_STICKY,START_REDELIVER_INTENT,START_STICKY_COMPATIBILITY)
Service運行在哪個進程,哪個線程。
Android的事件派發機制,畫出一些View嵌套之後,能講清DOWN,MOVE,UP是怎麼傳遞的。dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。如何處理事件衝突。
《Android開發藝術探索》中有一章專門介紹了事件的傳遞,與衝突處理。
requestDisallowInterceptTouchEvent,onInterceptTouchEvent兩個方法事件是如何知道要派發到哪個view上的
MotionEvent中有點擊的x,y座標,結合view自身的座標大小,應該可以判斷。Android的繪製流程,如何使用onMeasure,onLayout,onDraw方法,ViewGroup的onDraw在沒有背景下不調用,可以調用dispatchDraw。結合自己寫過的自定義控件說一說。
Android實現View移動的方法
Scroller(注意移動的是子view),layout等等,詳細在《Android羣英傳》中有一章做了詳細介紹。AsyncTask的原理(Handler,線程池,Future),AsyncTask使用過程的坑。
HandlerThread的原理,與IntentService的原理。
說一說Android中的動畫
視頻播放涉及到的,MediaPlayer的生命週期
SurfaceView與View的區別
RemoteView的用處
桌面小部件,通知欄的自定義佈局。Android進程優先級
前臺進程,可見進程,服務進程,後臺進程,空進程Android的誇進程通信
AIDL,Messager,Binder,其實都是基於Binder,有興趣可以閱讀Binder源碼,很有挑戰性。
其他:文件,數據庫,xml,socket等Android插件化原理,結合流行的插件原理,與自家公司的插件框架講講。還有插件如何通信。
Android常見的框架OKHttp,Volley,Retrofit,OrmLite,ImageLoader,Fresco,LeakCanary,Rx Java,React Native,fastjson等自己熟悉的,最好看過他們源碼,能講清原理。
ListView如何優化
adapter的優化,Android羣英傳,中有講。UI優化(內存優化,繪製優化,佈局優化)
內存泄露處理,一般Context的泄露。如何發現,處理。
Intent-Filter過濾規則,顯示意圖,隱式意圖。
常用adb命令
Android的大圖載入
保證不OOM;
LRU cache;
先Decode基本信息,在Decode具體數據;
RegionBitmapDecoder加載局部圖形數據。圖形矩陣變換,顏色矩陣變換
如何避免ANR
JAVA對象序列化與Android序列化
apk的打包流程
sqlite數據庫相關的
看過哪些Android源碼(加分項)
結合自己看過的源代碼說一說,面試官很喜歡有鑽研精神的人。推薦書籍鄧凡平《深入理解Android源碼》,老羅博客,悠然紅茶的博客(感覺這個比老羅的源碼分析寫的通俗易懂),鴻洋博客開放問題:關注過哪些Android新技術,對Google IO大會關注,你如何做性能優化的。
網絡篇
TCP協議三次握手過程及其的目的。TCP斷開4次揮手。
TCP,UDP的區別。
http屬於哪一層
http請求的時候都發生了什麼
http協議分爲幾部分,請求行(GET,POST,PUT,DELETE等方式,協議版本號,請求路徑),請求頭(包含的字段),請求體;響應行(返回狀態碼),響應頭(包含的字段),響應體。
Get,Post區別
http請求頭響應頭都有哪些字段,說說keep-alive,trunk,range字段
優酷面試被問到:http的pipeline(這個之前沒聽過),移動wap的代理,發送一個http請求會有什麼區別
http斷點下載原理
push服務原理,xmpp協議
算法篇
基本排序算法:快速排序,堆排序,歸併排序,冒泡排序,插入排序,選擇排序,希爾排序。(能任意默寫,並說出原理,還有各種排序算法衍生的算法題目)
查找算法:二分查找,哈希查找
總結下常見面試題的算法,有些是面試被問到的。大部分摘自劍指offer,按照數據結構分了下類,前邊的標號表示書內的第幾個面試題。
鏈表
從尾到頭打印鏈表
16:反轉鏈表
17:合併兩個排序的鏈表
判斷鏈表是否有環
37:兩個鏈表的第一個公共節點
15:求鏈表的倒數第k個節點
O1時間內刪除鏈表節點
26:複雜鏈表的複製
56:鏈表中環的入口結點
57:刪除鏈表中重複的結點(複雜點,需要考慮頭節點刪除,使用了指針的指針)棧,隊列
兩個棧實現一個隊列,兩個隊列實現一個棧
包含min函數的棧
棧的壓入彈出序列二叉樹
二叉樹的遍歷,先序,中序,後序。遞歸,非遞歸。(深度優先遍歷)
6:重建二叉樹
23:從上往下打印二叉樹(層序遍歷二叉樹,廣度優先遍歷)
18:樹的子結構
19:二叉樹的鏡像(先序遍歷,先判斷空,首先賦值交換兩個孩子)
59:對稱的二叉樹(先序遍歷,判斷是不是都未null,返回true,返回一個爲null返回FALSE,判斷兩個不相等,返回FALSE )
24:二叉搜索樹的後序遍歷序列(遞歸判斷,很類似於重建二叉樹,主要是找到根元素,然後劃分左子樹序列,右子樹序列,在遞歸重複上述過程)
25:二叉樹中和爲某一值的路徑(進入的時候value壓入棧,最後方法返回的時候,彈出value,遞歸前判斷left,right不爲空)
二叉搜索樹與雙向鏈表(中序便利)
39:二叉樹的深度(遞歸,判斷left與right的大小,大的加1,node爲null返回0);判斷二叉樹是否平衡,後序遍歷求深度同時判斷是否平衡,兩個子樹高度差絕對值小於等於1才能深度加1,返回TRUE,否則返回FALSE。
樹中兩個節點的最低公共祖先
二叉樹的下一個結點
60:把二叉樹打印成多行(用兩個變量,一個表示當前剩餘多少沒打印,另一個表示下一行有多少個元素)
按之字形順序打印二叉樹
序列化二叉樹
二叉搜索樹的第k個結點
數據流中的中位數字符串
字符串的排列,字符的組合http://blog.csdn.net/industriously/article/details/51525630
最長子串
迴文串(左右掃描);迴文數(反轉數字是否等於原來數字);字符串中迴文串的個數;串中的最長迴文子串。
替換字符串中的空格(先求出替換結果的數組長度,然後從後往前替換)
把字符串轉換成整數(注意判斷正負數,判斷是否溢出,0x7FFF FFFF 0x8000 0000,判斷非法字符,判斷Null,空字符)
正則表達式匹配(都到結尾匹配成功;pattern串到結尾,text串到結尾匹配失敗;單獨判斷*的情況(text走1步,pattern走兩步,text走1步,pattern不走,text不走,pattern走2步),在判斷.與普通字符情況)
53:表示數值的字符串
字符流中第一個不重複的字符(初始化hash爲-1,hash存儲字符位置,再次出現更新爲-2,最後打印hash表中最小的大於等於0的值的位置的字符)
35:第一個只出現一次的字符(哈希存儲次數,然後遍歷獲取次數,打印第一個爲1的字符)
42:翻轉單次順序VS左旋字符串(先反轉整體,在反轉局部)數組
數組中重複的數字
構建乘積數組
3:二維數組中的查找
4:替換空格(先求出替換結果的數組長度,然後從後往前替換)
14:調整數組順序使奇數位於偶數前邊(兩個指針兩端掃描,不變順序可以採用插入排序思想)
20:順時針打印矩陣
31:連續子數組的最大和
33:把數組排成最小的數字(前邊的數字小的放到前邊,mn與nm比較大小,然後快排,從小到大,輸出的就是最小數字)
36:數組中的逆序對(歸併排序,並統計)
38:數字在排序數組中出現的次數(二分查找,查找頭尾)
40:數組中只出現一次的數字(哈希表存儲,或者,其他出現偶數次,這樣可以異或,單數異或爲1)
41:和爲s的兩個數字VS和爲s的連續正數序列(哈希存儲;小於s逐漸遞增,大於s刪除最前邊的數字)排序,查找
七大基本排序算法
二分查找
哈希查找
旋轉數組的最小數字
數組中出現次數超過一般的數字
最小,最大的k個數
38:數字在排序數組中出現的次數(二分)
3:二維數組中的查找
大文件(假設內存不能全部載入)中有很多int類型的數字,所有數字中有一個出現了兩次,其他的只出現了一次。求出現了兩次的數字。
大文件中有一個數字出現頻率超過了百分之五十,找到這個數字。
使用位向量法解決大文件問題。回溯法
66:矩陣中的路徑
67:機器人的運動範圍動態規劃
0-1揹包問題
最長公共子序列
連續子數組最大和
斐波那契數列,青蛙跳臺階,地板磚排列。其他
位運算,二進制中1的個數
11:數值的整數次方(考慮特殊情況,正負次方,任何0以外的數的0次方都是1)
12:打印1到最大的n位數(n可能超出表示範圍,字符串全排列)
32:從1到n整數中1出現的次數
34:醜數
43:n個骰子的點數
44:撲克牌的順子
45:圓圈中最後剩下的數字
漢諾塔
書單
- Java書籍
Head First Java
Core Java
Think in Java(以上書籍都可以做JAVA的基礎知識掃盲強化)
Effective Java(很薄的一本書,適合有了一定JAVA經驗的看,做相關總結)
深入理解Java虛擬機(理解JAVA虛擬機原理) - Android書籍
第一行代碼(Android基礎學習)
Android開發藝術探索
Android羣英傳
Android研發錄
Android應用性能優化
深入理解Android源碼 卷1 2
Android系統源代碼情景分析(老羅的書籍,比較晦澀)
Android內核剖析(有點老) - 設計模式
Head First Design Pattern
大話設計模式(入門書籍)
Android源碼設計模式解析與實戰 - 數據結構算法
數據結構-嚴蔚敏
大話數據結構
數據結構與算法分析:Java語言描述
算法的樂趣
劍指offer(70多道算法題,涵蓋了互聯網公司面試的大多數算法面試題)
編程之美(比劍指offer稍微難一些的算法題)
編程珠璣 - 其他(學習的亂七八糟的其他知識)
數學之美(科普數學,算法,工程等相關知識的原理,讓非專業讀者也能領略數學的魅力)
鳥哥的Linux私房菜(基礎學習篇)(主要是爲了學習shell)
Linux內核設計與實現(講述Linux系統的原理)
c++ Primer Plus
Python基礎教程
JavaScript高級程序設計(在校學習web前端買的,系統講了js)