雙非本科字節跳動Android面試題分享(已拿offer)


基本情況

本人系非985非211普通本科生一枚,有實習有項目經歷但成績普通,在面試前刷了很多面經、面試題,這里也把自己的分享下,做個回報好了,順便攢攢人品,一到這種時候人就迷信起來了。

面試是以視頻面試的形式進行的,在牛客網里進行,界面我就不貼了,沒截圖。

首先是面試的基本流程,剛開始是自我介紹。隨后面試官會問你一些基本問題。接下來就是根據你的簡歷啊、前面說的內容啊來問一些針對性的問題,然后會問很多基本知識,像是計算機網絡、操作系統、編譯原理這些。

一面

面我的面試官是做 iOS 的,就沒問我 Android 的。

1、ipv6 答不上來
2、http 狀態碼
3、http 請求
4、https 請求過程
5、傳送大圖到服務器,進度功能實現: 這里扯了很多,一開始我理解成斷點續傳了,后面就是給的方案是 http 每次傳一部分,根據狀態碼是否成功來處理,后面面試官覺得這個答案不行,讓我從 TCP UDP Socket 這些角度去想,我說這些實現起來就更簡單了,比如TCP就雙向通信之類的。。
6、gc
7、數據庫索引,b tree b+ tree
8、設計模式
9、進程間通信,我說了幾個,面試官說可以說 Android 的,好得!
10、算法: 字符串匹配,返回對應 index, 我用的 HashMap 實現。

大多數都是問的網絡,網絡不是我擅長的領域,有些別的想不起了。。。

不止是題目,面試官會深入進去懟的,別問我懟啥,被懟的忘光了都!

面試官人很好,還強調了他低頭是寫面試評價。

二面

面試官依舊很 OK,可惜網絡狀態不佳。

面試官:我看上一面問了你網絡層面比較多的問題,那我接着問了
我:。。。好。
先自我介紹

1、Http1.1 和 Http 1.0 區別
2、keepalive 作用
3、keepalive 底層實現,這塊我是不清楚的,我就猜測了下給了他一個答案。
4、操作系統怎么在堆上和棧上分配內存,我不太清楚,就說了 Java 虛擬機是咋分配的,結果問了我 Java 虛擬機是咋在操作系統上分配的,對不起我不知道!(后面強調了 c 的 api,我還是母雞啊!)
5、操作系統進程和線程
6、虛擬內存
7、虛擬內存的緩存,我不清楚,依舊給了個猜測
8、手寫單例,寫了雙重檢索的,后面問我有別的嗎,我說了靜態內部類實現的,問我為啥靜態內部類安全。
9、Android Framework,我問是 AMS 那些的嗎,面試官說那太復雜了,你說下 handler , loop吧,然后問了一些相關的問題。(感動啊)
10、廣播和本地廣播的區別,實現原理
11、你用 map 寫個 lru 吧,我說能用 LinkedHashMap 嗎,不能, 后面我說了個思路,面試官覺得不行,然后說了 LruCache 怎么實現的, LinkedHashMap 怎么實現的,我說 LinkedHashMap 是用了 HashMap,在里面維護了一個雙向鏈表,每次訪問數據的時候修改鏈表。后面我就打算仿寫一個 LinkedHashMap 來實現,多虧面試官即使打斷,這個太費時間了,就不用寫了。
12、手寫生產者消費者,這里面試官一邊看代碼一邊提問題,我跟着問題修改代碼,其實就是把一個比較low 的生產者消費者優化成了面試官想要的樣子(面試官在這里終於笑了)。
13、問問題環節
Q:我想了解下相關的業務
A:這個職位是最后統一定的,我不能告訴你
Q: 問評價
A: 還是不能告訴你。
over

同樣大致問題是這些,其他的也想不起來了,這塊網絡操作系統混合雙打。

面試官人很棒,會誘導你慢慢回答,而且考慮很周到。

補充

好像還有個 rxjava 的問題,這里補充下

一面問我 rxjava,我說我之前封裝過一個 rxbus,來實現消息總線,后面我是說了下消息總線對代碼的影響還是比較大的,我到后面是盡量避免這樣的操作。

二面問我,一面評價說你覺得 rxjava 並不好,我趕緊說不是不行,rxbus 只是 rxjava 功能的一小部分,而是消息總線這樣的方案有利有弊。

后面說rxbus 具體封裝 ,太久遠了想不起來了,然后說了 rxjava 其他的用法和優點這一類的。

后來問我不用消息總線怎么實現通信,我說了可以用原生的方式 startActivityForResult 之類的。

跨Activity怎么辦?

所以我說消息總線這些有利有弊,應該在設計上盡量避免這樣的操作。

三面

  1. 自我介紹,介紹了自己實習寫的刷新加載的組件
  2. 問我自己組件里怎么解決的嵌套滑動沖突,三個方面實現完美分發事件
  3. 說 retrofit 動態***這塊
  4. retrofit 動態***里面如果傳的不是 interface 怎么辦,這塊我不清楚,我就直接說不太清楚,然后說了 retrofit 關於注解的處理
  5. 注解生命周期,編譯時注解解析
  6. 你用過 weex,說下weex實現原理,我說我沒有看過 weex 源碼,但是我實現過一個動態頁面渲染框架,說了下我的渲染過程和實現方案。
  7. 最近想學的技術,說了音視頻,但是因為准備春招放下了
  8. 為什么想學,說了自己之前做一個 APP,里面播放器無法使用沒認證的 Https 請求,打算自定義一個播放器,在底層處理證書這塊,然后在說了下不知道這樣的方案可不可行。
  9. 使用 https 請求這個不難的, 我說因為我這個是自己簽的,就沒法認證。
  10. 那你 okhttp 里面怎么認證的, 說了攔截器
  11. 還有個 ConcurrentHashMap 同步方案, 然后問了 CAS
  12. 環狀鏈表
  13. TCP握手揮手

問問題環節

跟二面一樣的問題,順便問了下今年的怎么招聘的,涼面太多看的我很慌張。

一二三面問題可能搞混,順序有些打亂,有些問題可能記不清了,三面面試官依然棒,雖然問題節奏很快,但是問題都很棒。

健忘症想起來可能還問了這些(記不起來第幾面的了,大部分在第二面吧)

  1. 鎖, synchronized 和 ReenTrantLock
  2. 搶占式鎖和非搶占式鎖,ReenTrantLock 怎么實現非搶占式
  3. notify 和 sleep 區別
  4. onTouch 和 onClick (這個我隱約中好像被問過
  5. 注解處理器,這個我二面三面都有扯到,因為自己實現過動態路由的簡單功能
  6. 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,共勉!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM