一位開發多年的Android老司機以爲深知熟路,擼完這份大廠警示面試,直呼好險差點犯了致命錯誤!

背景

寒冬季節裏找工作真心累啊,不過沒辦法,公司要搬離上海,所以只能出來找工作了,這段時間被虐的夠慘的,一個學歷就被搞死了,同事工作經驗跟我差不多,都是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大佬學習筆記等等,這些內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章