文章爲作者的面試經驗,除此以外,作者撰寫和收集了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、面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:
總結
改變人生,沒有什麼捷徑可言,這條路需要自己親自去走一走,只有深入思考,不斷反思總結,保持學習的熱情,一步一步構建自己完整的知識體系,纔是最終的制勝之道,也是程序員應該承擔的使命。
以上內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 微信 獲取。