背景
寒冬季節裏找工作真心累啊,不過沒辦法,公司要搬離上海,所以只能出來找工作了,這段時間被虐的夠慘的,一個學歷就被搞死了,同事工作經驗跟我差不多,都是6年的老菜鳥,本科,投了10家面了兩家,我投了幾十家暫時才面了3家,差距,誰在跟我說學歷不是問題,我一磚頭拍不死他丫的。廢話不多說了,總結了一下:
Android
首先Android這一塊,個人建議除了一些基礎知識上的正確理解之外,一定要看源碼,至少要看Handler機制、AsyncTask以及兩三個開源庫的源碼,有時間的話,可以對着下面的清單該看源碼的一定要看,例如Glide、OkHttp等,這樣你纔不會被打上,只是一個會使用工具的人的標籤,而是一個懂得工具原理的人,這會讓你在面試中有一個很大的加分。
- 什麼是 ANR 如何避免它?(騰訊)
- Activity 和 Fragment 生命週期有哪些?
- 橫豎屏切換時候 Activity 的生命週期
- AsyncTask 的缺陷和問題,說說他的原理。
- android 中進程的優先級?
- Bunder 傳遞對象爲什麼需要序列化?Serialzable 和 Parcelable 的區別?
- 動畫
- Context 相關
- Android 各版本新特性
- Json
- Jar 和 Aar 的區別
- Android 爲每個應用程序分配的內存大小是多少
- 更新 UI 方式
- ContentProvider 使用方法
- Merge、ViewStub 的作用
- 四大組件的生命週期(美團)
- Activity 之間的通信方式
- 橫豎屏切換的時候,Activity 各種情況下的生命週期
- Activity 與 Fragment 之間生命週期比較
- Activity 上有 Dialog 的時候按 Home 鍵時的生命週期
- 兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?
- Activity 的四種啓動模式對比
- Activity 狀態保存於恢復
- fragment 各種情況下的生命週期是如何管理的
- 序列化的作用,以及 Android 兩種序列化的區別
- 談談對接口與回調的理解
- Android 中數據存儲方式
- Android 屬性動畫特性
- ART(字節跳動)
- Apk 包體優化
- Hook
- Proguard
- 架構
- Jetpack
- NDK 開發
- 類加載器
Java(重點)
這裏羅列的知識點,很多都是需要去真正消化理解,例如知道了保證線程安全的實現方式,那麼也要會解決一些實際場景,比如手寫一個生產者消費者模型,或者,一個線程打印奇數,一個線程打印偶數,交替打印,最終輸出1,2,3,4…….等。所以不要死記硬背,理解性記憶也是最高效的一種方式。
- HashMap 和 HashTable 以及 CurrentHashMap 的區別(騰訊)
- synchronized 和 volatile 、ReentrantLock 、CAS 的區別
- JVM 類加載機制、垃圾回收算法對比、Java 虛擬機結構等
- Java 的四大引用
- Java 的泛型,<? super T> 和 <? extends T> 的區別
- Java 線程有哪些狀態,有哪些鎖,各種鎖的區別
- final 、finally、finalize 區別
- 接口和抽象類的區別
- sleep 、wait、yield 的區別,wait 的線程如何喚醒它?
- java 中==和 equals 和 hashCode 的區別
- 接口的意義
- String、StringBuffer、StringBuilder 區別(美團)
- 講一下常見編碼方式?
- 進程和線程的區別
- 序列化 Serializable 和 Parcelable 的區別
- string 轉換成 integer 的方式及原理
- 靜態代理和動態代理的區別,什麼場景使用?
- 說說你對 Java 反射的理解
- 說一下泛型原理,並舉例說明
- 說說你對 Java 註解的理解
- 數據類型(字節跳動)
- 包裝類型
- 緩存池
- 線程安全
- Object 通用方法
- 繼承
- 反射
- 異常
- 泛型
- 註解
- 容器中的設計模式
- 迭代器模式
- 源碼分析
- 線程狀態轉換
- 實現 Runnable 接口和 Callable 接口的區別
- 執行 execute() 方法和 submit() 方法的區別是什麼呢?
- 如何創建線程池
- 介紹一下 Atomic 原子類
- 講講 AtomicInteger 的使用
計算機網絡
- TCP 與 UDP 的區別(騰訊)
- 三次握手、四次揮手。爲啥是三次不是兩次?
- HTTPS 和 HTTP 的區別。HTTP 2.0,3.0?
- 瀏覽器輸入一個 URL,按下回車網絡傳輸的流程?
- TCP 建立連接後,發包頻率是怎樣的?
- OKHttp
- 如何驗證證書的合法性?
- https 中哪裏用了對稱加密,哪裏用了非對稱加密,對加 密法(如 RSA)等是否有了解?
- client 如何確定自己發送的消息被 server 收到?
- 談談你對 WebSocket 的理解
- WebSocket 與 Socket 的區別
- 談談你對安卓簽名的理解
- 請解釋安卓爲啥要加簽名機制?
數據結構及算法
- 排序(騰訊)
- 二叉樹
- 鏈表
- 棧 / 隊列
- 二分
- 哈希表
- 堆 / 優先隊列
- 二叉搜索樹
- 數組 / 雙指針
- 貪心
- 字符串處理
- 動態規劃
- 矩陣(字節跳動)
- 二進制 / 位運算
- 反轉整數
- LRU 緩存策略
面試總結一下
總結一下吧主要涉及的幾塊內容就是:
- 四大組件
- Handler
- View的繪製
- 事件分發機制
- 滑動衝突
- 滑動套嵌
- 進程保活
- 性能優化
關於基礎知識如何準備
從上面一個拿到offer的流程來看,我們可以發現不管是筆試還是一面或者二面,都會涉及到基礎知識的考察,所以在準備校招的過程中,最最最核心的就是要把基礎知識打牢,具體包括,一門你最熟悉的語言,假設是Java,那麼Java基礎你肯定是要爛熟於心,包括
- Java關鍵字的含義和作用
- 接口和抽象類
- 多態和繼承
- 裝箱和拆箱
- …..
具體有哪些我會在後面整理出來,當然只會基礎,可能二面就比較難,所以還要進階,對於Java,進階包括
- Java內存區域
- Java內存模型
- Java GC機制
- 多線程安全
- …..
這裏只是舉幾個例子感受一下,那麼我該如何來準備呢?答案:看書+實踐+思考+總結
算法題如何準備
關於算法題如何準備,這個其實是最不好準備的,也是最容易準備的,算法題在整個拿offer的流程中處於一個特殊的地位,在筆試環節中,基本每個筆試題,最後都是兩道算法題,如果不能AC一半以上,那麼通過筆試的機率就比較小,如果能全部AC,當然更佳,除了筆試,在一面和二面中,一般都會以手撕兩道算法題來結束面試,當然這兩道手撕的算法題如果能直接給出最優解並寫出完整的代碼,那麼即便你前面的基礎和項目答的並不好,也是一個非常大的亮點,也可以讓你這次面試通過的機率提升很多,所以算法題起着舉足輕重的作用,在整個offer流程中。
那麼如何準備呢?首先關於算法,我建議首先在學算法前,先由簡至難,基礎掌握之後,直接去LeetCode官網從mid難度開始刷題,等mid難度差不多後,再挑戰hard難度,一般做客戶端開發,如果能夠刷上50道hard難度的題目,基本大部分面試的算法題都可以給出思路了,如果追求完美和保險,建議hard難度的題能刷多少是多少,多多益善。
項目如何準備
因爲我自己是做安卓的,但是我想不管是哪個方向,關於簡歷上寫的項目,面試官肯定都是會先讓你挑一個最熟悉的來講,那麼問題來了,我該怎麼將一個項目清晰的敘述給面試官呢,同時還要吸引面試官,讓這個項目成爲亮點?
關於這個問題,我們首先需要明確的是,我們在陳述任何一個問題的時候,邏輯一定要清晰,說話不要跳着說,那麼怎麼清晰的表達呢?分點+簡潔的概括。怎麼分點?比如有一個項目,我一般是分三點來講述,一、這個項目實現的功能,二、你在項目中具體做了什麼工作,三、取得的成效,然後就是簡潔的概括出來,這個比較有難度,所以強烈建議,每個項目都按照這三點事先準備概括好,然後隨着面試次數的增加,你就會形成肌肉記憶,之後,當面試官再讓你介紹一個項目的時候,毫不誇張的說你會發現你可以不帶腦子的回答這個問題。
hr面如何準備
一般技術面試到了hr面試,基本80%的可能就穩了,大部分hr面都是不會刷人的,當然一些極個別的公司除外,所以到了hr面,不用那麼緊張,正常對話交流即可,我們先來看看一般hr面會問些什麼問題,感受一下hr面的具體內容:
- 給前兩次面試打打分?爲什麼?
- 對上班時間有要求嗎?加班怎麼看?
- 你壓力最大的是什麼時候,怎麼應對的?
- 你未來的職業規劃是什麼?
- ............
最最最最重要的簡歷上寫的知識一定要會
這個之所以放到最後,是因爲這個是最快速有效的短期速成準備方法,如果我們因爲總總共原因,在時間上不允許像上面那樣去系統的準備基礎+項目+算法,那麼我希望你至少做到簡歷上的寫的知識能夠經得起問,所以,簡歷上寫的知識就一定要滾瓜爛熟,個人建議,儘量寫自己熟悉的點,和儘量寫有難度同時自己又有把握回答出來的點,如果實在是沒時間,那麼可以挑兩到三個點,例如Java的話,Java GC機制,Java synchrnoized關鍵字(鎖),不求多,但是要能做到經得起問,然後寫在簡歷上,這兩個點,花個2天應該能搞定,然後其它的就儘量寫自己會的。
寫完簡歷之後,一定要知道自己簡歷上涉及了哪些知識點,自己再將這些涉及到的知識點都總結歸納出來,例如,寫了Java多線程,那麼怎麼保證多線程,多線程鎖的類型,常見的生產者消費者模型手寫,這些就必須要會,當然你也可以假設自己是個面試官,看到自己的這份簡歷,可能會怎麼來考察自己,無非就是寫了什麼就儘量問什麼,對吧,所以最保險的就是把簡歷上的知識點抽取出來,然後羅列一個知識點清單,再對着這個清單上的每個點去一個個總結歸納能考察的問題。
結語
總的來說,在這次面試中,讓我深有體會的主要有兩個點,一個是,早做準備比什麼都重要,大部分秋招得意者都是從春招開始就持續準備,成功和機遇總是會眷顧有準備的人,運氣在這中間固然會佔有一些比重,但是僅憑運氣,是遠遠不夠的;第二個,在面試中,一個人有沒有自信,完全可以判若兩人,同時也會很大程度上影響最終結果,自信,真的是一種很優秀的品質,這種品質會讓你整個人散發無窮的個人魅力。
面試複習路線參考
目前我們要做的就是選好自己細分領域深入研究,對基礎原理性內容深入理解,儘快向高級水平靠近並達到。當然也要了解新技術,擁有開放的心態去學習一些新技術,不要一開始出來一個新技術就轉入學習,這樣會導致啥都會一點啥都不會,當然新技術是有一個發展過程的,不會立馬流行和大量應用等它稍微成熟點。
多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!
首先是超級詳細得不能再詳細的Android開發學習思維導圖,因爲圖片實在是太大了,所以我就只把二級目錄的內容放出來,更加詳細的你們可以主頁掃微信二維碼獲取。
接下來就需要梳理知識,提升儲備了!(Android移動架構師七大專題學習資源)
架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO
Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化
360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化
解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack
NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發
微信小程序:小程序介紹+UI開發+API操作+微信對接
Hybrid 開發與Flutter:Html5項目實戰+Flutter進階
知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
然後再是通過源碼來系統性地學習
只要是程序員,不管是Java還是Android,如果不去閱讀源碼,只看API文檔,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。
真正最能鍛鍊能力的便是直接去閱讀源碼,不僅限於閱讀各大系統源碼,還包括各種優秀的開源庫。
刷大廠面試題備戰,增加大廠通過率
歷時半年,整理了這份市面上最全面的安卓面試題解析大全。
1.可以通過目錄索引直接翻看需要的知識點,查漏補缺。
2.五角星數表示面試問到的頻率,代表重要推薦指數
以上內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 【微信】 獲取。
最後還有耗時一年多整理的一系列Android學習資源:Android源碼解析、Android第三方庫源碼筆記、Android進階架構師七大專題學習、歷年BAT面試題解析包、Android大佬學習筆記
等等,這些內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。