前言
此文希望能給想跳槽的朋友一些參考。
我們隨着工作時間的增加和技術經驗的積累。原先的公司不一定能繼續提供給你想要的發展空間與前景。說直接點,家里還有老婆孩子還有老父母,我們需要更高的薪酬讓他們過上更好的生活。所以跳槽是個不錯的選擇。
夏末的時候我就有了跳槽的想法。然后就是不斷的跑了很多家公司面試。前后花了將近兩個月時間。拿到了華為,美團,去哪兒以及一些不太出名的公司的offer。
一、簡歷
首先是准備簡歷,然后就是過一下面試題。
簡歷的編寫其實這里可能需要注意幾點:
1.標題的直接按照姓名-幾年工作經驗-應聘崗位格式來填寫。例如 小明——四年工作經驗——Android開發高級工程師。因為要知道,HR篩選簡歷是非常快的,你要在第一時間就讓他看到他想要看的信息。HR一開始最關心的就是工作年限和崗位,你直接在標題欄用最大的字體寫出來會比很多人介紹了半天項目最后寫年限要好得多。
2.個人信息寫最前面。 個人信息欄其實不用寫很多東西,最主要的就是姓名、聯系方式、性別、如果學校是名校那么就寫上,如果本科學的是計算機專業也可以在這里寫上,如果都不是就最好放到最后去寫,因為最前面的東西永遠是最先看到的內容,也是你最有競爭力和賣弄的資本。
3.有技術博客和github開源項目的一定寫在最前面。 這是活生生的例子。我在面試華為的時候面試官就特意去看了我的csdn上的博客。然后說寫的還是不錯的,給他留下了一個不錯的印象,所以這點是絕對的加分項最好就是寫在最前面。
刷面試題這塊其實一開始我並沒有刷特別多,也就是簡單的看了下一些基礎性的知識點。因為我始終覺得看的越多越記不住,而且最重要的是你根本不知道面試官會怎么問,與其盲目的看知識點倒不如先出去找幾家小公司面試找找感覺,知道面試官會針對哪些地方詢問,再回來針對性的看。
二、技能儲備
(一)Java
一、HashMap和Hashtable區別?
這個一定要去看源碼!看源碼!看源碼!實在看不下去的可以上網看別人的分析。簡單總結有幾點:
1.HashMap支持null Key和null Value;Hashtable不允許。這是因為HashMap對null進行了特殊處理,將null的hashCode值定為了0,從而將其存放在哈希表的第0個bucket。
2.HashMap是非線程安全,HashMap實現線程安全方法為Map map = Collections.synchronziedMap(new HashMap());Hashtable是線程安全
3.HashMap默認長度是16,擴容是原先的2倍;Hashtable默認長度是11,擴容是原先的2n+1
4.HashMap繼承AbstractMap;Hashtable繼承了Dictionary
擴展,HashMap 對比 ConcurrentHashMap ,HashMap 對比 SparseArray,LinkedArray對比ArrayList,ArrayList對比Vector
二、Java垃圾回收機制
需要理解JVM,內存划分——方法區、內存堆、虛擬機棧(線程私有)、本地方法棧(線程私有)、程序計數器(線程私有), 理解回收算法——標記清除算法、可達性分析算法、標記-整理算法、復制算法、分代算法,優缺點都理解下。
詳細的可以看看其他同學寫的 點擊打開鏈接
三、類加載機制
這個可以結合 熱修復 深入理解下。點擊打開鏈接
四、線程和線程池,並發,鎖等一系列問題
這個可以擴展下 如何自己實現一個線程池?
五、HandlerThread、IntentService理解
六、弱引用、軟引用區別
七、int、Integer有什么區別
主要考值傳遞和引用傳遞問題
八、手寫生產者/消費者 模式
(二)Android
一、android啟動模式
需要了解下Activity棧和taskAffinity
1.Standard:系統默認,啟動一個就多一個Activity實例
2.SingleTop:棧頂復用,如果處於棧頂,則生命周期不走onCreate()和onStart(),會調用onNewIntent(),適合推送消息詳情頁,比如新聞推送詳情Activity;
3.SingleTask:棧內復用,如果存在棧內,則在其上所有Activity全部出棧,使得其位於棧頂,生命周期和SingleTop一樣,app首頁基本是用這個
4.SingleInstance:這個是SingleTask加強本,系統會為要啟動的Activity單獨開一個棧,這個棧里只有它,適用新開Activity和app能獨立開的,如系統鬧鍾,微信的視頻聊天界面不知道是不是,知道的同學告訴我下,在此謝過!
另外,SingleTask和SingleInstance好像會影響到onActivityResult的回調,具體問題大家搜下,我就不詳說。
Intent也需要進一步了解,Action、Data、Category各自的用法和作用,還有常用的
Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TOP
等等,具體看下源碼吧。
二、View的繪制流程
ViewRoot
-> performTraversal()
-> performMeasure()
-> performLayout()
-> perfromDraw()
-> View/ViewGroup measure()
-> View/ViewGroup onMeasure()
-> View/ViewGroup layout()
-> View/ViewGroup onLayout()
-> View/ViewGroup draw()
-> View/ViewGroup onDraw()
看下invalidate方法,有帶4個參數的,和不帶參數有什么區別;requestLayout觸發measure和layout,如何實現局部重新測量,避免全局重新測量問題。
三、事件分發機制
-> dispatchTouchEvent()
-> onInterceptTouchEvent()
-> onTouchEvent()
requestDisallowInterceptTouchEvent(boolean)
還有onTouchEvent()、onTouchListener、onClickListener的先后順序
四、消息分發機制
這個考得非常常見。一定要看源碼,代碼不多。帶着幾個問題去看:
1.為什么一個線程只有一個Looper、只有一個MessageQueue?
2.如何獲取當前線程的Looper?是怎么實現的?(理解ThreadLocal)
3.是不是任何線程都可以實例化Handler?有沒有什么約束條件?
4.Looper.loop是一個死循環,拿不到需要處理的Message就會阻塞,那在UI線程中為什么不會導致ANR?
5.Handler.sendMessageDelayed()怎么實現延遲的?結合Looper.loop()循環中,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。
五、AsyncTask源碼分析
優劣性分析,這個網上一大堆,不重述。
六、如何保證Service不被殺死?如何保證進程不被殺死?
這兩個問題我面試過程有3家公司問到。
七、Binder機制,進程通信
Android用到的進程通信底層基本都是Binder,AIDL、Messager、廣播、ContentProvider。不是很深入理解的,至少ADIL怎么用,Messager怎么用,可以寫寫看,另外序列化(Parcelable和Serilizable)需要做對比,這方面可以看看任玉剛大神的android藝術開發探索一書。
八、動態權限適配問題、換膚實現原理
這方面看下鴻洋大神的博文吧
九、SharedPreference原理,能否跨進程?如何實現?
(三)性能優化問題
一、UI優化
a.合理選擇RelativeLayout、LinearLayout、FrameLayout,RelativeLayout會讓子View調用2次onMeasure,而且布局相對復雜時,onMeasure相對比較復雜,效率比較低,LinearLayout在weight>0時也會讓子View調用2次onMeasure。LinearLayout weight測量分配原則。
b.使用標簽
c.減少布局層級,可以通過手機開發者選項>GPU過渡繪制查看,一般層級控制在4層以內,超過5層時需要考慮是否重新排版布局。
d.自定義View時,重寫onDraw()方法,不要在該方法中新建對象,否則容易觸發GC,導致性能下降
e.使用ListView時需要復用contentView,並使用Holder減少findViewById加載View。
f.去除不必要背景,getWindow().setBackgroundDrawable(null)
g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局
二、內存優化
主要為了避免OOM和頻繁觸發到GC導致性能下降
a.Bitmap.recycle(),Cursor.close,inputStream.close()
b.大量加載Bitmap時,根據View大小加載Bitmap,合理選擇inSampleSize,RGB_565編碼方式;使用LruCache緩存
c.使用 靜態內部類+WeakReference 代替內部類,如Handler、線程、AsyncTask
d.使用線程池管理線程,避免線程的新建
e.使用單例持有Context,需要記得釋放,或者使用全局上下文
f.靜態集合對象注意釋放
g.屬性動畫造成內存泄露
h.使用webView,在Activity.onDestory需要移除和銷毀,webView.removeAllViews()和webView.destory()
備:使用LeakCanary檢測內存泄露
三、響應速度優化
Activity如果5秒之內無法響應屏幕觸碰事件和鍵盤輸入事件,就會出現ANR,而BroadcastReceiver如果10秒之內還未執行操作也會出現ANR,Serve20秒會出現ANR 為了避免ANR,可以開啟子線程執行耗時操作,但是子線程不能更新UI,因此需要Handler消息機制、AsyncTask、IntentService進行線程通信。
備:出現ANR時,adb pull data/anr/tarces.txt 結合log分析
四、其他性能優化
a.常量使用static final修飾
b.使用SparseArray代替HashMap
c.使用線程池管理線程
d.ArrayList遍歷使用常規for循環,LinkedList使用foreach
e.不要過度使用枚舉,枚舉占用內存空間比整型大
f.字符串的拼接優先考慮StringBuilder和StringBuffer
g.數據庫存儲是采用批量插入+事務
(四)設計模式
1.單例模式:好幾種寫法,要求會手寫,分析優劣。一般雙重校驗鎖中用到volatile,需要分析volatile的原理
2.觀察者模式:要求會手寫,有些面試官會問你在項目中用到了嗎?實在沒有到的可以講一講EventBus,它用到的就是觀察者模式
3.適配器模式:要求會手寫,有些公司會問和裝飾器模式、代理模式有什么區別?
4.建造者模式+工廠模式:要求會手寫
5.策略模式:這個問得比較少,不過有些做電商的會問。
6.MVC、MVP、MVVM:比較異同,選擇一種你拿手的着重講就行
(五)數據結構
1.HashMap、LinkedHashMap、ConcurrentHashMap,在用法和原理上有什么差異,很多公司會考HashMap原理,通過它做一些擴展,比如中國13億人口年齡的排序問題,年齡對應桶的個數,年齡相同和hash相同問題類似。
2.ArrayList和LinkedList對比,這個相對簡單一點。
3.平衡二叉樹、二叉查找樹、紅黑樹,這幾個我也被考到。
4.Set原理,這個和HashMap考得有點類似,考hash算法相關,被問到過常用hash算法。HashSet內部用到了HashMap
(六)算法
算法主要考刷題吧,去LeetCode和牛客網刷下。
(七)源碼理解
項目中多多少少會用到開源框架,很多公司都喜歡問原理和是否看過源碼,比如網絡框架Okhttp,這是最常用的,現在Retrofit+RxJava也很流行。
一、網絡框架庫 Okhttp
okhttp源碼一定要去看下,里面幾個關鍵的類要記住,還有連接池,攔截器都需要理解。被問到如何給某些特定域名的url增加header,如果是自己封裝的代碼,可以在封裝Request中可以解決,也可以增加攔截器,通過攔截器去做。
推薦一篇講解Okhttp不錯的文章
二、消息通知 EventBus
1.EventBus原理:建議看下源碼,不多。內部實現:觀察者模式+注解+反射
2.EventBus可否跨進程問題?代替EventBus的方法(RxBus)
三、圖片加載庫(Fresco、Glide、Picasso)
1.項目中選擇了哪個圖片加載庫?為什么選擇它?其他庫不好嗎?這幾個庫的區別
2.項目中選擇圖片庫它的原理,如Glide(LruCache結合弱引用),那么面試官會問LruCache原理,進而問LinkedHashMap原理,這樣一層一層地問,所以建議看到不懂的追進去看。如Fresco是用來MVC設計模式,5.0以下是用了共享內存,那共享內存怎么用?Fresco怎么實現圓角?Fresco怎么配置緩存?
四、消息推送Push
1.項目中消息推送是自己做的還是用了第三方?如極光。還有沒有用過其他的?這幾家有什么優勢區別,基於什么原因選擇它的?
2.消息推送原理是什么?如何實現心跳連接?
五、TCP/IP、Http/Https
網絡這一塊如果簡歷中寫道熟悉TCP/IP協議,Http/Https協議,那么肯定會被問道,我就驗證了。一般我會回答網絡層關系、TCP和UDP的區別,TCP三次握手(一定要講清楚,SYN、ACK等標記位怎樣的還有報文結構都需要熟悉下),四次揮手。為什么要三次握手?DDoS攻擊。為什么握手三次,揮手要四次?Http報文結構,一次網絡請求的過程是怎樣的?Http和Https有什么不同?SSL/TLS是怎么進行加密握手的?證書怎么校驗?對稱性加密算法和非對稱加密算法有哪些?挑一個熟悉的加密算法簡單介紹下?DNS解析是怎樣的?
六、熱更新、熱修復、插件化(這一塊要求高點,一般高級工程師是需要理解的)
了解classLoader
七、新技術
RxJava、RxBus、RxAndroid,這個在面試想去的公司時,可以反編譯下他們的包,看下是不是用到,如果用到了,面試過程難免會問道,如果沒有,也可以忽略,但學習心強的同學可以看下,比較是比較火的框架。
Retrofit,熟練okhttp的同學建議看下,聽說結合RxJava很爽。
Kotlin
三、最后
簡歷首選內推方式,速度快,效率高啊!然后可以在拉鈎,boss,脈脈上看看。簡歷上寫道熟悉什么技術就一定要去熟悉它,不然被問到不會很尷尬!做過什么項目,即使項目體量不大,但也一定要熟悉實現原理!不是你負責的部分,也可以看看同事是怎么實現的,換你來做你會怎么做?做過什么,會什么是廣度問題,取決於項目內容。但做過什么,達到怎樣一個境界,這是深度問題,和個人學習能力和解決問題的態度有關了。大公司看深度,小公司看廣度。大公司面試你會的,小公司面試他們用到的你會不會,也就是崗位匹配度。
選定你想去的幾家公司后,先去一些小的公司練練,學習下面試技巧,總結下,也算是熟悉下面試氛圍,平時和同事或者產品PK時可以講得頭頭是道,思路清晰至極,到了現場真的不一樣,怎么描述你所做的一切,這絕對是個學術性問題!
面試過程一定要有禮貌!即使你覺得面試官不尊重你,經常打斷你的講解,或者你覺得他不如你,問的問題缺乏專業水平,你也一定要尊重他,誰叫現在是他選擇你,等你拿到offer后就是你選擇他了。
另外,描述問題一定要慢!不要一下子講一大堆,慢顯得你沉穩、自信,而且你還有時間反應思路接下來怎么講更好。現在開發過多依賴ide,所以會有個弊端,當我們在面試講解很容易不知道某個方法怎么讀,這是一個硬傷…所以一定要對常見的關鍵性的類名、方法名、關鍵字讀准,有些面試官不耐煩會說“你到底說的是哪個?”這時我們會容易亂了陣腳。正確的發音+沉穩的描述+好聽的嗓音決對是一個加分項!
最重要的是心態!心態!心態!重要事情說三遍!面試時間很短,在短時間內對方要摸清你的底子還是比較不現實的,所以,有時也是看眼緣,這還是個看臉的時代。
學習分享
在當下這個信息共享的時代,很多資源都可以在網絡上找到,只取決於你願不願意找或是找的方法對不對了
很多朋友不是沒有資料,大多都是有幾十上百個G,但是雜亂無章,不知道怎么看從哪看起,甚至是看后就忘
如果大家覺得自己在網上找的資料非常雜亂、不成體系的話,我也分享一套給大家,比較系統,我平常自己也會經常研讀。
2020最新上萬頁的大廠面試真題

七大模塊學習資料:如NDK模塊開發、Android框架體系架構…

只有系統,有方向的學習,才能在段時間內迅速提高自己的技術。
這份體系學習筆記,適應人群:
**第一,**學習知識比較碎片化,沒有合理的學習路線與進階方向。
**第二,**開發幾年,不知道如何進階更進一步,比較迷茫。
第三,到了合適的年紀,后續不知道該如何發展,轉型管理,還是加強技術研究。如果你有需要,我這里恰好有為什么,不來領取!說不定能改變你現在的狀態呢!
由於文章內容比較多,篇幅不允許,部分未展示內容以截圖方式展示 。如有需要獲取完整的資料文檔的朋友點擊我的GitHub免費獲取。
