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

基本狀況

本人系非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怎麼辦?

因此我說消息總線這些有利有弊,應該在設計上儘可能避免這樣的操做。

三面

  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,共勉!

相關文章
相關標籤/搜索