基本狀況
本人系非985非211普通本科生一枚,有實習有項目經歷但成績普通,在面試前刷了不少面經、面試題,這裏也把本身的分享下,作個回報好了,順便攢攢人品,一到這種時候人就迷信起來了。前端
面試是以視頻面試的形式進行的,在牛客網裏進行,界面我就不貼了,沒截圖。vue
首先是面試的基本流程,剛開始是自我介紹。隨後面試官會問你一些基本問題。接下來就是根據你的簡歷啊、前面說的內容啊來問一些針對性的問題,而後會問不少基本知識,像是計算機網絡、操做系統、編譯原理這些。java
一面
面個人面試官是作 iOS 的,就沒問我 Android 的。react
一、ipv6 答不上來
二、http 狀態碼
三、http 請求
四、https 請求過程
五、傳送大圖到服務器,進度功能實現: 這裏扯了不少,一開始我理解成斷點續傳了,後面就是給的方案是 http 每次傳一部分,根據狀態碼是否成功來處理,後面面試官以爲這個答案不行,讓我從 TCP UDP Socket 這些角度去想,我說這些實現起來就更簡單了,好比TCP就雙向通訊之類的。。
六、gc
七、數據庫索引,b tree b+ tree
八、設計模式
九、進程間通訊,我說了幾個,面試官說能夠說 Android 的,好得!
十、算法: 字符串匹配,返回對應 index, 我用的 HashMap 實現。android
大多數都是問的網絡,網絡不是我擅長的領域,有些別的想不起了。。。webpack
不止是題目,面試官會深刻進去懟的,別問我懟啥,被懟的忘光了都!git
面試官人很好,還強調了他低頭是寫面試評價。程序員
二面
面試官依舊很 OK,惋惜網絡狀態不佳。github
面試官:我看上一面問了你網絡層面比較多的問題,那我接着問了
我:。。。好。
先自我介紹web
一、Http1.1 和 Http 1.0 區別
二、keepalive 做用
三、keepalive 底層實現,這塊我是不清楚的,我就猜想了下給了他一個答案。
四、操做系統怎麼在堆上和棧上分配內存,我不太清楚,就說了 Java 虛擬機是咋分配的,結果問了我 Java 虛擬機是咋在操做系統上分配的,對不起我不知道!(後面強調了 c 的 api,我仍是母雞啊!)
五、操做系統進程和線程
六、虛擬內存
七、虛擬內存的緩存,我不清楚,依舊給了個猜想
八、手寫單例,寫了雙重檢索的,後面問我有別的嗎,我說了靜態內部類實現的,問我爲啥靜態內部類安全。
九、Android Framework,我問是 AMS 那些的嗎,面試官說那太複雜了,你說下 handler , loop吧,而後問了一些相關的問題。(感動啊)
十、廣播和本地廣播的區別,實現原理
十一、你用 map 寫個 lru 吧,我說能用 LinkedHashMap 嗎,不能, 後面我說了個思路,面試官以爲不行,而後說了 LruCache 怎麼實現的, LinkedHashMap 怎麼實現的,我說 LinkedHashMap 是用了 HashMap,在裏面維護了一個雙向鏈表,每次訪問數據的時候修改鏈表。後面我就打算仿寫一個 LinkedHashMap 來實現,多虧面試官即便打斷,這個太費時間了,就不用寫了。
十二、手寫生產者消費者,這裏面試官一邊看代碼一邊提問題,我跟着問題修改代碼,其實就是把一個比較low 的生產者消費者優化成了面試官想要的樣子(面試官在這裏終於笑了)。
1三、問問題環節
Q:我想了解下相關的業務
A:這個職位是最後統必定的,我不能告訴你
Q: 問評價
A: 仍是不能告訴你。
over
一樣大體問題是這些,其餘的也想不起來了,這塊網絡操做系統混合雙打。
面試官人很棒,會誘導你慢慢回答,並且考慮很周到。
補充
好像還有個 rxjava 的問題,這裏補充下
一面問我 rxjava,我說我以前封裝過一個 rxbus,來實現消息總線,後面我是說了下消息總線對代碼的影響仍是比較大的,我到後面是儘可能避免這樣的操做。
二面問我,一面評價說你以爲 rxjava 並很差,我趕忙說不是不行,rxbus 只是 rxjava 功能的一小部分,而是消息總線這樣的方案有利有弊。
後面說rxbus 具體封裝 ,過久遠了想不起來了,而後說了 rxjava 其餘的用法和優勢這一類的。
後來問我不用消息總線怎麼實現通訊,我說了能夠用原生的方式 startActivityForResult 之類的。
跨Activity怎麼辦?
因此我說消息總線這些有利有弊,應該在設計上儘可能避免這樣的操做。
三面
- 自我介紹,介紹了本身實習寫的刷新加載的組件
- 問我本身組件裏怎麼解決的嵌套滑動衝突,三個方面實現完美分發事件
- 說 retrofit 動態***這塊
- retrofit 動態***裏面若是傳的不是 interface 怎麼辦,這塊我不清楚,我就直接說不太清楚,而後說了 retrofit 關於註解的處理
- 註解生命週期,編譯時註解解析
- 你用過 weex,說下weex實現原理,我說我沒有看過 weex 源碼,可是我實現過一個動態頁面渲染框架,說了下個人渲染過程和實現方案。
- 最近想學的技術,說了音視頻,可是由於準備春招放下了
- 爲何想學,說了本身以前作一個 APP,裏面播放器沒法使用沒認證的 Https 請求,打算自定義一個播放器,在底層處理證書這塊,而後在說了下不知道這樣的方案可不可行。
- 使用 https 請求這個不難的, 我說由於我這個是本身籤的,就無法認證。
- 那你 okhttp 裏面怎麼認證的, 說了攔截器
- 還有個 ConcurrentHashMap 同步方案, 而後問了 CAS
- 環狀鏈表
- TCP握手揮手
問問題環節
跟二面同樣的問題,順便問了下今年的怎麼招聘的,涼麪太多看的我很慌張。
一二三面問題可能搞混,順序有些打亂,有些問題可能記不清了,三面面試官依然棒,雖然問題節奏很快,可是問題都很棒。
健忘症想起來可能還問了這些(記不起來第幾面的了,大部分在第二面吧)
- 鎖, synchronized 和 ReenTrantLock
- 搶佔式鎖和非搶佔式鎖,ReenTrantLock 怎麼實現非搶佔式
- notify 和 sleep 區別
- onTouch 和 onClick (這個我隱約中好像被問過
- 註解處理器,這個我二面三面都有扯到,由於本身實現過動態路由的簡單功能
- cookie 和 session 記得沒答好這個
兩星期後收到了offer,終於趕在畢業前上岸了
經驗總結
總的來講,本身若是有想要去的大公司,必定要提高好本身,讓本身的能力和素質與公司匹配的上,我也一直相信,機會永遠是留給有準備的人。
在字節面試前我也準備了好久,刷了不少大廠面試題,知識點整理出來分享給你們:
Java基礎
-
Java Object類方法
-
HashMap原理,Hash衝突,併發集合,線程安全集合及實現原理
-
HashMap 和 HashTable 區別
-
HashCode 做用,如何重載hashCode方法
-
ArrayList與LinkList區別與聯繫
-
GC機制
-
Java反射機制,Java代理模式
-
Java泛型
-
Synchronized原理
-
Volatile實現原理
-
方法鎖、對象鎖、類鎖的意義和區別
-
線程同步的方法:Synchronized、lock、reentrantLock分析
-
Java鎖的種類: 公平鎖、樂觀鎖、互斥鎖、分段鎖、偏向鎖、自旋鎖等
-
ThreadLocal的原理和用法
-
ThreadPool的用法和示例
-
wait()和sleep()的區別
Java高階
-
Java虛擬機,Java運行,Java GC機制(可達性分析法,引用計數法)
-
Java對象的完整生命週期
-
JVM內存模型
-
進程間通訊,線程間通訊
-
JVM類加載機制
-
Java引用類型
-
設計模式:除經常使用設計模式以外,特別的,反射機制,代理模式
-
HTTP協議和HTTPS協議
-
Socket協議,Socket實現長鏈接
-
TCP和UDP協議
-
HTTP協議中GET和POST的具體實現
-
序列化和反序列化
-
線程池的實現原理
-
數據庫基礎知識:多表查詢、索引、數據庫事務
數據結構及算法
數據結構
-
棧和隊列
-
數組和鏈表,自定義一個動態數組
-
Hash表,及Hash衝突的解決
-
二叉樹
-
B+ B-樹
-
基礎排序算法:重點 快排、歸併排序、堆排序(大根堆、小根堆)
-
快排的優化
-
二分查找與變種二分查找
-
哈夫曼樹、紅黑樹
-
字符串操做,字符串查找,KMP算法
-
圖的BFS、DFS、prim、Dijkstra算法(高階技能)
-
經典問題:海量數據的處理 (10億個數中找出最大的10000個數 TOP K問題)
算法
-
分治算法
-
動態規劃
-
貪心算法
-
分支限界法
Android基礎
-
Application生命週期
-
Android Activity生命週期
-
Android Service、IntentService,Service和組件間通訊
-
Activity的onNewIntent
-
Fragment的懶加載實現,參數傳遞與保存
-
ContentProvider實例詳解
-
BroadcastReceiver使用總結
-
Android消息機制
-
Binder機制,共享內存實現原理
-
Android 事件分發機制
-
Android 多線程的實現:Thread、HandlerThread、AsyncTask、IntentService、RxJava
-
ActivityThread工做原理
-
嵌套滑動實現原理
-
RecyclerView與ListView(緩存原理,區別聯繫,優缺點)
-
View的繪製原理,自定義View,自定義ViewGroup
-
View、SurfaceView 與 TextureView
-
主線程Looper.loop爲何不會形成死循環
-
ViewPager的緩存實現
-
requestLayout,invalidate,postInvalidate區別與聯繫
-
AndroidP新特性
-
Android兩種虛擬機
-
ADB經常使用命令
-
Asset目錄與res目錄的區別
-
Android SQLite的使用入門
Android開發高級
各類原理,經典第三方庫源碼系列
-
自定義LayoutManager,RecyclerView中如何自定義LayoutManager
-
VLayout實現原理,即如何自定義LayoutManager
-
Glide加載原理,緩存方案,LRU算法
-
Retrofit的實現與原理
-
OKHttp3的使用,網絡請求中的Intercept
-
EventBus實現原理
-
ButterKnife實現原理
-
RxJava實現原理
-
Dagger依賴注入
-
熱修復實現原理,解決方案
-
組件化原理和解決方案
Android系統
Android Studio編譯過程
其中使用到的編譯工具:
aapt、aidl、Java Compiler、dex、 zipalign
主要步驟描述:
1. 經過aapt打包res資源文件,生成R.java、resources.arsc和res文件(二進制 & 非二進制如res/raw和pic保持原樣)
2. 處理.aidl文件,生成對應的Java接口文件
3. 經過Java Compiler編譯R.java、Java接口文件、Java源文件,生成.class文件
4. 經過dex命令,將.class文件和第三方庫中的.class文件處理生成classes.dex
5. 經過apkbuilder工具,將aapt生成的resources.arsc和res文件、assets文件和classes.dex一塊兒打包生成apk
6. 經過Jarsigner工具,對上面的apk進行debug或release簽名
7. 經過zipalign工具,將簽名後的apk進行對齊處理。
移動開發外圍
服務器開發相關
SpringBoot技術
Restful API開發
網絡協議理解:TCP/IP、HTTP/HTTPS、OSI七層協議
受權認證協議: OAuth2.0 等
基本的數據庫技術
數據緩存技術:Memcached、Redis,Web緩存原理
消息隊列技術
監控、日誌分析技術
前端開發相關
前端開發知識不少,框架層出不窮,本質的東西卻只有如下這些。
核心必備:HTML、CSS、JavaScript
入門提升:瀏覽器兼容性、自定義UI和動效
中級技能:框架層出不窮,當前以vue.js、react.js 爲核心
協做開發技能:包管理、模塊化,工具採用 npm、webpack等
高級技能:框架原理源碼研究
開發調試各類工具
性能分析工具:Memory Monitor
性能追蹤及方法執行分析: TraceView
視圖分析:Hierarchy Viewer
ApkTool- 用於反向工程Android Apk文件的工具
Lint- Android lint工具是一個靜態代碼分析工具
Dex2Jar- 使用android .dex和java .class文件的工具
代碼改變世界,要早日成爲技術大牛,程序員肩上的擔子但是很重啊。趁如今開始,還不晚!
最後祝願你也能順利拿下大廠offer,共勉!