這次面試字節跳動也是做了很多的準備,還好順利拿到了offer,特分享一下這次的4面技術面真題,以及一份字節2-2師兄整理的面試手冊,希望能夠給一些正在面試字節或計劃面試大廠的朋友提供幫助。
字節跳動技術一面
- 講一下線程參數的含義
- Innodb的索引實現
- 為什么是B+樹?
- redis的使用,分布式鎖的實現
- 操作系統虛擬內存換頁的過程
- TCP三次握手
- volatile關鍵字的作用
- 樂觀鎖、悲觀鎖
- 之前用過哪些設計模式?
- 算法題:滑動窗口
字節跳動技術二面
- 說一下B樹和B+樹的區別
- 說一下HashMap的實現,擴容機制,擴容時如何保證可操作?
- Redis擴容機制(漸進式單線程擴容)
- Spring IoC的原理,如何實現,如何解決循環依賴?
- 兩線程對變量i進行加1操作,結果如何?為什么?怎么解決?
- CAS概念、原子類實現原理
- synchronize底層實現,如何實現Lock?
- AQS有什么特點?
- 手寫項目中某個模塊代碼。
- 介紹各種網絡協議。
- DNS在網絡層用哪個協議,為什么。
- 介紹HTTPS協議,詳述SSL建立連接過程。
- 代碼題:反轉單鏈表。
- 代碼題:復雜鏈表復制。
字節跳動技術三面
- 算法題多到爆炸,感覺是算法專場,宇宙條果真名不虛傳
- 說一下JAVA垃圾回收機制
- 64匹馬,8個賽道,找最快的4匹馬
- 給出兩個升序數組A、B和長度m、n,求第k個大的
- 給出數組A,長度為n,數組中元素的值位于[0, n - 1]之間,求是否有重復元素
- 講一下多線程與多進程區別
- JVM中什么時候會進行垃圾回收?什么樣的對象是可以回收的?
- Spring主要思想是什么?
字節跳動技術四面
- 場景題目:設計一個短域名服務:短信存不了太長網站,需要弄成短域名,你該如何設計一個服務,可以為全國的網址服務。
- TCP為什么是三次握手四次揮手?
- 數據庫的隔離級別
- sql題,寫了個連表查詢外加模糊查詢
- 算法:鏡像二叉樹 ......
4月11號郵件收到信息,HR直接給了意向書,查收然后確認好了,確定了入職時間。
總的來說,自己如果有想要去的大公司,一定要提升好自己,讓自己的能力和素質與公司匹配的上,我也一直相信,機會永遠是留給有準備的人。
Java
基礎
Java 基礎這部分有一些太簡單的問題就直接沒有放上來。小伙伴們可以參考:Java 基礎知識點總結[2]。
- Java 中的幾種基本數據類型是什么?對應的包裝類型是什么?各自占用多少字節呢?
- String 、 StringBuffer 和 StringBuilder 的區別是什么? String為什么是不可變的?
- == 與 equals?hashCode 與 equals ?
- Java 反射?反射有什么缺點?你是怎么理解反射的(為什么框架需要反射)?
- 談談對 Java 注解的理解,解決了什么問題?
- Java 泛型了解么?什么是類型擦除?介紹一下常用的通配符?
- 內部類了解嗎?匿名內部類有了解嗎?
- BIO,NIO,AIO 有什么區別?
Java 集合框架
- 說說 List,Set,Map 三者的區別?三者底層的數據結構?
- 有哪些集合是線程不安全的?怎么解決呢?
- 比較 HashSet、LinkedHashSet 和 TreeSet 三者的異同
- HashMap 和 Hashtable 的區別?HashMap 和 HashSet 區別?HashMap 和 TreeMap 區別?
- HashMap 的底層實現
- HashMap的長度為什么是 2 的冪次方
- ConcurrentHashMap 和 Hashtable 的區別?
- ConcurrentHashMap 線程安全的具體實現方式底層具體實現
jvm
- jvm 內存結構
- jvm 調優參數
- 什么是類加載?何時類加載?類加載流程?
- 知道哪些類加載器。類加載器之間的關系?
- 類加載器的雙親委派了解么?結合 Tomcat 說一下雙親委派(Tomcat 如何打破雙親委托機制?
- 為什么需要雙親委派
- Java 內存模型
- 棧中存放什么數據,堆中呢?
- 大對象放在哪個內存區域
- 堆區如何分類
- 垃圾回收有哪些算法
- GC 的全流程
- GC 中老年代用什么回收方法?
多線程
- 線程和進程的區別。
- 什么是上下文切換?
- 什么是線程死鎖?如何避免死鎖?
- 樂觀鎖和悲觀鎖了解么?
- 說說 sleep() 方法和 wait() 方法區別和共同點?
- Java 線程池有哪些參數?阻塞隊列有幾種?拒絕策略有幾種?新線程添加的流程?
- 實現 Runnable 接口和 Callable 接口的區別。
- 講一下 JMM(Java 內存模型)。volatile 關鍵字解決了什么問題?說說 synchronized 關鍵字和 volatile 關鍵字的區別。
- AQS 原理了解么?AQS 組件有哪些?
- 用過 CountDownLatch 么?什么場景下用的?
網絡
- OSI 與 TCP/IP 各層的結構與功能,都有哪些協議?為什么網絡要分層?
- 計算機網絡的一些常見狀態碼
- ping 所使用的協議
- TCP 的三次握手與四次揮手的內容?TCP 為什么連接是三次握手而斷開是四次握手?
- TCP 與 UDP 的區別及使用場景
- TCP 是如何保證傳輸的可靠性?
- 一次完整的 HTTP 請求所經的步驟
- HTTP 協議了解么?HTTP 是基于 TCP 還是 UDP 的?
- HTTP 報文的內容簡單說一下!HTTP 請求報文和響應報文中有哪些數據?
- HTTP 和 HTTPS 的區別了解么?
- HTTP 請求有哪些常見的狀態碼?
- HTTP 長連接和短連接了解么?
- Cookie 和 Session 的關系
- URI 和 URL 的區別是什么?
算法和數據結構
- LRU 算法了解嗎?你能實現一個嗎?
- 寫排序算法(快排、堆排)
- 使用數組實現一個棧
- 使用數組實現一個隊列
- 實現一個鏈表、反轉鏈表、
- ......
數據結構
- 數組 vs 鏈表
- 棧的應用場景
- 隊列的分類、應用場景
- 紅黑樹的特點、紅黑樹 vs 二叉查找樹
- 哈希表、哈希表應用場景
- 布隆過濾器了解嗎?
- ......
設計模式
- 何為設計模式?有哪些常見的設計模式?
- 單例模式了解么?說一下單例模式的使用場景。手寫一個單例模式的實現。
- 觀察者模式了解么?說一下觀察者模式的使用場景。
- 工廠模式了解么?說一下工廠模式的使用場景。
- 責任鏈模式了解么?哪些開源項目(Netty、MyBatis ...)中用到了責任鏈模式?怎么用的?
- SOLID 原則了解么?簡單談談自己對于單一職責原則和開閉原則的理解。
- 閱讀 Spring 源碼的時候什么設計模式最讓你影響深刻?能簡單講講嗎?
常見框架
Spring
- 什么是 Spring 框架?
- 列舉一些重要的 Spring 模塊?
- 談談自己對于 Spring IoC 和 AOP 的理解
- Spring Bean 的生命周期說一下
- Spring 中的 bean 的作用域有哪些?
- 攔截器和過濾器了解么?
- Spring 動態代理默認用哪一種
- hibernate 和 mybatis 區別
- Spring Boot 和 Spring 的區別
- 說出使用 Spring Boot 的主要優點
- 什么是 Spring Boot Starter?
- 介紹一下@SpringBootApplication 注解
- Spring Boot 的自動配置是如何實現的?
- Spring Boot 支持哪些嵌入式 web 容器?
Netty
- BIO,NIO 和 AIO 有啥區別?
- Netty 是什么?為啥不直接用 NIO 呢?
- 為什么要用 Netty?Netty 應用場景了解么?
- 介紹一下 Netty 的核心組件?
- Bootstrap 和 ServerBootstrap 了解么?
- NioEventLoopGroup 默認的構造函數會起多少線程?
- Netty 線程模型了解么?
- 什么是 TCP 粘包/拆包?有什么解決辦法呢?
- Netty 長連接、心跳機制了解么?
權限認證
- 認證 (Authentication) 獲授權 (Authorization)的區別是什么?
- 什么是 Cookie ? Cookie 的作用是什么?如何在服務端使用 Cookie ?
- Cookie 和 Session 有什么區別?如何使用 Session 進行身份驗證?
- 如果沒有 Cookie 的話 Session 還能用嗎?
- 為什么 Cookie 無法防止 CSRF 攻擊,而 token 可以?
- 什么是 Token?什么是 JWT?如何基于 Token 進行身份驗證?
- 什么是 OAuth 2.0?
- 什么是 SSO(單點登錄)?
微服務/分布式
RPC
RPC 基礎:
- 了解 RPC 嗎?有哪些常見的 RPC 框架?
- 如果讓你自己設計 RPC 框架你會如何設計?
- 服務之間的調用為啥不直接用 HTTP 而用 RPC?
Dubbo:
- Dubbo 了解嗎?
- Dubbo 的工作原理了解么?注冊中心扮演了什么角色?注冊中心掛了可以繼續通信嗎?
- Dubbo 的負載均衡策略了解么?
- Dubbo 的 spi 機制了解么?帶來了啥好處?
消息隊列
- 為什么要用消息隊列?
- 對比一下常見的消息隊列?
- 如何保證消息不被重復消費?
- 如何保證消息消費的順序性?
分布式 ID
- 何為 ID?
- 何為分布式 ID?
- 一個合格的分布式 ID 需要滿足什么要求?
- 分布式 ID 常見的生成方法有哪些?(數據庫主鍵自增、數據庫的號段模式、UUID、SNOWFLAKE 等等)
其他(網關、限流...)
- 為什么要網關?
- 為什么要用分布式鎖?有哪些實現方式?
- 限流的算法有哪些?
- 什么是服務熔斷?什么是服務降級?
- 為什么要分布式 id ?分布式 id 生成策略有哪些?
- 微服務下為什么需要鏈路追蹤系統?
數據庫
MySQL
基礎
- 非關系型數據庫和關系型數據庫的區別?
- 事務的四大特性了解么?
- MySQL 事務隔離級別?默認是什么級別?
- 樂觀鎖與悲觀鎖的區別?
- MySQL 數據庫兩種存儲引擎的區別?
索引
- 為什么索引能提高查詢速度?
- 聚集索引和非聚集索引的區別?非聚集索引一定回表查詢嗎?
- 索引這么多優點,為什么不對表中的每一個列創建一個索引呢?(使用索引一定能提高查詢性能嗎?)
- 索引底層的數據結構了解么?Hash 索引和 B+樹索引優劣分析
- B+樹做索引比紅黑樹好在哪里?
- 最左前綴匹配原則了解么?
- 什么是覆蓋索引
Redis
- 分布式緩存常見的技術選型方案有哪些?說一下 Redis 和 Memcached 的區別和共同點
- 說一下在緩存情況下查詢數據和修改數據的流程。
- Redis 有哪些數據結構?SDS 了解么?
- Redis 內存滿了怎么辦?
- Redis 內存淘汰算法除了 LRU 還有哪些?
- Redis 給緩存數據設置過期時間有啥用?Redis 是如何判斷數據是否過期的呢?
- Redis 事務了解么?(Redis 可以通過 MULTI,EXEC,DISCARD 和 WATCH 等命令來實現事務功能)
- 緩存穿透和緩存雪崩問題了解么?有哪些解決辦法?
- 如何基于 Redis 實現分布式鎖?
進階
- 一條 SQL 語句在 MySQL 是如何執行的?
- explain 命令了解么?
- 簡單說一下 SQL 調優思路。
- 簡單說一下大表優化的思路。
- 分庫分表了解么?為什么要分庫分表?有哪些常見的分庫分表工具(sharding-jdbc、TSharding、MyCAT...)?
系統設計/場景題
- 假如有 10 億個數,只有一個重復,內存只能放下 5 億個數,怎么找到這個重復的數字?
- 如何設計一個秒殺系統(服務端、數據庫、分布式)?分布式系統的設計?
- 有一個服務器專門接收大量請求,怎么設計?
- 如果讓你自己設計 RPC 框架你會如何設計?
- 怎么快速出現一個 stackoverflow 錯誤?
其他問題
- 自我介紹。
- 說說你的項目中的亮點有哪些。
- 畫一下你的項目的架構圖。
- Restful 了解嗎?簡單說一下自己對它的認識,如果我要返回一個 boolean 類型的數據怎么辦?
經驗總結
這是我在工作、面試中學習并總結到的一些知識點,都是一些比較典型的、面試常被問到的問題。如果你平時沒有注意去總結的話,那么當你面試被問到的時候可能會是一臉懵圈,就算這個問題你知道怎么回事,但是你平時沒有認真總結,你也可能會出現邏輯混亂的情況,從而錯失工作機會。