初生牛犢不怕虎!畢業未滿月的Android實習生在大廠橫衝直撞後,手握多份offer,特此分享!

文章爲作者的面試經驗,除此以外,作者撰寫和收集了7個大類的知識點,可以滑到文末點擊獲取學習。

前言

本人是國內某985大三本科生,說來慚愧,大一剛學完C語言還是勉強會用函數的水平,準確來說我的編程生涯開始於大一下學期,這兩年間我算是進步速度比較快,中間也比常人花了更多時間在編程和看書上。

大三寒假有幸在搜狐公司實習,三月開始準備實習生春招(實際上這時候有點晚了,以至於我阿里一面面的很不好)。

最近一個月也面了騰訊百度頭條美團等公司,而今天接到騰訊HR確認offer的電話,激動之餘不由得感嘆,實習生春招終於是結束了。

本文僅列舉最近面試的公司的面經,一個月之前還面試過攜程阿里騰訊頭條等公司,也拿到了攜程的offer,面經都在文末整理的資料中,裏面也有一些平時的總結和筆記,主要針對Android和Java,希望對正在找工作或者實習的同學有幫助。

廢話不多說,下面是面經。

美團

美團一面面了74分鐘,比較重基礎,算法,操作系統,網絡,Android,Java挨個問了個遍。

個人感覺還行,不過美團面試流程太慢,至今未等到二面。

算法

  • 常用排序算法
  • 複雜度
  • 比較器用的哪種?
  • 快排怎麼寫?
  • 完全二叉樹高度爲n結點最多有多少
  • 漢諾塔問題怎麼解決
  • 鏈表和數組比較?

操作系統

  • 進程衝突
  • 生產者消費者問題
  • 設邏輯分頁和物理分頁好處是什麼
  • 什麼是髒內存

網絡

  • http1.1相比以前版本有什麼改變
  • 七層/五層模型
  • tcpip分別對應哪層
  • https的對稱加密

Java

  • public等四個權限關鍵字的區別
  • synchronized的用法區別,可否嵌套
  • hashmap底層實現,擴容策略,初始化
  • arraylist和linkedlist的實現和區別
  • classloader的作用,雙親委託
  • gc算法(優缺點)
  • 爲什麼叫新生代老年代(晉升機制)
  • 強軟弱虛四種引用的區別

Android

  • activity退出怎麼保存數據
  • 怎麼把數據寫入文件
  • picasso的緩存策略
  • lrucache底層實現
  • linkedhashmap底層實現
  • 緩存文件怎麼命名
  • RxJava優缺點,實習項目相關
  • 自定義view有幾個構造方法,第三個參數作用
  • listview的convert view作用,用viewholder爲什麼可以優化他。

百度

百度一面問了很多性能優化的問題,

  • 還有app被殺死怎麼啓動
  • 耗電太多怎麼破
  • 怎麼統計crash
  • 怎麼減少用戶流量消耗
  • 事件分發機制
  • ontouchlistener返回false纔會調用onclicklistener
  • 消息機制
  • view的繪製原理
  • 方法數超過65535怎麼辦
  • binder
  • anr
  • listview優化
  • bitmap怎麼避免oom
  • Java靜態內部類和內部類的區別
  • 垃圾回收機制
  • 元空間有哪些東西
  • hashmap和hashtable區別
  • list和set區別

今日頭條

頭條暑期一面:

  • 二維數組二分查找的最優算法
  • 數組元素從左到右從上到下遞增
  • retrofit原理
  • recyclerview和listview異同
  • 各自緩存原理
  • handler原理
  • activity生命週期
  • 四種啓動模式區別
  • singletask啓動standard的activity在哪個棧
  • android多進程和多線程的實現
  • 進程和線程區別
  • java泛型類型擦除發生在什麼時候,通配符有什麼需要注意的。
  • hashmap刪除鍵值對的過程
  • 擴容算法
  • hashcode和equals有什麼關係
  • java保證線程安全有哪些方法
  • volatile和synchronized各有何作用
  • 瀏覽器打開一個網頁的過程發生了什麼
  • 擅長android哪些方面?

騰訊

內推一面:

  • final作用
  • 下拉刷新加載更多的原理
  • RxJava優點
  • map
  • flatmap的原理
  • 可不可以多次subscribeOn,ObserveOn,會有什麼後果
  • lambda表達式?和匿名內部類的不同
  • http協議和https,ssl和tls握手

內推二面:

  • 自我介紹,項目經歷
  • java finalize關鍵字的用法
  • try 裏面return了finally還會執行嗎?執行順序是?
  • wait和sleep的區別,應用場景
  • gc發生在什麼時候
  • 死鎖發生的條件
  • tcp三次握手的過程?
  • 如果確認信號沒傳到服務器會發生什麼?爲什麼不是兩次握手?
  • 一個無序數組怎麼找出兩個和爲特定值的數?
  • 快排後首尾兩遊標
  • 12個雞蛋有一個質量不同,如何只稱三次測出
  • 開發過程中有沒有實際遇到內存泄露情況,怎麼解決的
  • activity四種啓動模式區別和應用場景
  • service生命週期,兩種啓動方式的區別
  • 實現ipc的方法有哪些?
  • handler的內在原理
  • 消息隊列爲空會怎樣?
  • 換主題功能怎麼實現?
  • 如果有機會來騰訊實習,你比較感興趣的技術有哪些?

網申一面:

當時面完沒記錄,主要是針對簡歷提問,大致問了:

  • 動畫
  • handler的原理
  • GC
  • 雙親委託模型
  • 容器類源碼
  • 四大組件
  • 紅黑樹
  • activity四種啓動模式及其用途
  • Java實現線程安全有哪些方式
  • TCP三次握手四次揮手
  • 線程進程區別
  • Android多進程相關
  • socket相關
  • 怎麼設計一個檢測內存泄漏的第三方框架
  • 爲什麼用Picasso不用更好的庫
  • RxJava相關
  • 手寫一個線程安全的單例模式

網申二面:

技術總監面,學到了很多。基礎真的很重要。基礎不好就會更早迎來瓶頸。

大致問了項目:

  • NP問題
  • 斷點調試功能怎麼設計
  • 也聊到一點在實驗室做過的APK逆向工程
  • 寫編譯器
  • APP啓動過程以及其中的堆棧分配
  • 以及技術成長道路什麼的

這是印象最深的一次我感覺面完非常暢快並且受益匪淺,正了我在技術方面的誤區,非常感謝面試官。

HR面:

HR面就輕鬆一點了。

  • 面了哪些公司,爲什麼沒過
  • 家庭情況
  • 愛好
  • 項目經歷和自己負責的部分,成績
  • 對部門瞭解多少
  • 看過哪些專業書籍
  • 想去哪裏發展,經常回家嗎

和聊天差不多。面完第二天顯示已完成所有面試。

總結就是簡歷很重要,一份好的簡歷可以大大提升拿offer的概率,簡歷上實習經歷和項目經歷是亮點。

面試之前準備工作也很重要(尤其簡歷上的東西要非常熟悉,面經也可以刷一刷)。

基礎知識也很重要,切不可只會寫Android APP而忽視了算法,網絡等基礎。個人認爲,對校招來說,想進大公司光能夠寫出漂亮的APP是不夠的。正如二面面試官所說那樣,非科班的也能做。

基礎和深度是很重要的,比如Android可以多看看源碼或者原理,而Java,算法,網絡,操作系統,編譯原理這些都應該熟練掌握。下面推薦一些我大一到大三看過的技術書籍。

推薦書籍

  • c++ primer plus
  • efficient c++
  • CSAPP
  • thinking in java
  • 深入理解Java虛擬機
  • Android開發藝術探索
  • Android開發進階:從小工到專家(何紅輝著)
  • 第一行代碼第二版(郭霖著)
  • effective Java
  • 操作系統概念
  • 算法導論
  • 數據結構與算法分析(Java語言描述)
  • Java8函數式編程
  • 劍指offer
  • 彙編語言(王爽著)
  • 計算機網絡(謝希仁著,據說是考研書)
  • 數據庫系統概念
  • 設計模式之禪(好在通俗,想了解更深還是《Android源碼設計模式》更好)

一些沒看過但是據說不錯的:

  • TCP/IP詳解(有三卷)
  • TCP/IP協議族
  • STL源碼剖析
  • 鳥哥的Linux私房菜
  • the c programming language
  • Android設計模式源碼剖析
  • 計算機程序的構造與解釋

作爲一個才寫了Android一年多的菜鳥,我平時也比較關注一些大佬的公衆號和博客,還有美團,微信,QQ空間等團隊的技術博客,包括一些知乎專欄。平時還是要多積累才能厚積薄發。希望自己能不斷進步。也希望這篇博客對各位有一點點幫助。

面試複習路線

多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!

這裏給大家提供一個方向,進行體系化的學習:

1、看視頻進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。

另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你。

2、進行系統梳理知識,提升儲備

客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

系統學習方向:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO

  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化

  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化

  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack

  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發

  • 微信小程序:小程序介紹+UI開發+API操作+微信對接

  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

3、讀源碼,看實戰筆記,學習大神思路

“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。

主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。

4、面試前夕,刷題衝刺

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

總結

改變人生,沒有什麼捷徑可言,這條路需要自己親自去走一走,只有深入思考,不斷反思總結,保持學習的熱情,一步一步構建自己完整的知識體系,纔是最終的制勝之道,也是程序員應該承擔的使命。

以上內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 微信 獲取。

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