BAT大廠面試的100道考題【算法、源碼、架構、中間件、設計模式、網絡、項目】,過60分的不到10%

作者:小傅哥
博客:https://bugstack.cn

沉澱、分享、成長,讓自己和他人都能有所收穫!😄


獨生子女生娃,沒救了!

小傅哥,你的100道Java考題,我只考了16分,是不是沒救了!給我個答案吧!那麼鑑於不少小夥伴已經考完了,那麼小傅哥就做一個考題解析,方便讀者可以針對自己的問題進行補充學習。

其實這些考題只是相當於在你的技術棧地圖中,拎出100個檢查站點,進行片段化的提問,來檢查你對知識網的覆蓋程度。而學習的最終目標遠不是來背這些題,那樣是沒有多大的意義的,否則你在面對面試官時換個方向再問,可能你還是沒法回答。所以更有意義的事是慢下來,不貪多,一步一個腳印的用自己的思考和實踐驗證學會這些內容。

好啦,小傅哥就做個這些問題的分析,如果你還沒有參與考試也可以先嚐試考一下,再看解答會更有感覺。

解析:考題知識點

1. 算法(1~10)

01:常見的數據結構有哪些

02:優先隊列是基於什麼數據結構實現?

03:HashMap 解決哈希碰撞的數據結構?

04:ArrayDeque 實現堆擴容時需要進行幾次元素拷貝?

05:基於數組實現的二叉堆,元素k如何計算父節點

  • 選項
    • A.k >> 1
    • B.(k + 1) << 1
    • C.(k - 1) <<< 1
    • D.(k - 1) >>> 1
  • 答案:D
  • 解析:基於數組實現的二叉堆所有子節點與父節點的位置關係,是子節點除以2取整,就是父節點的位置。之所以是這樣的一個計算關係,因爲它整個二叉堆上每一層元素在數組位置的存放上,就是一個1、2、4、8碼的結構,也就是二進制結構。所以可以除以2取整計算父節點位置。那麼使用二進制計算就是 (k - 1) >>> 1
  • 詳細https://bugstack.cn/md/algorithm/data-structures/2022-09-03-heap.html

06:鏈表刪除任意元素的時間複雜度

  • 選項
    • A.O(1)
    • B.O(n)
    • C.O(logn)
    • D.O(n^2)
  • 答案:B
  • 解析:鏈表的操作只有插入的時間複雜度是O(1),其他操作時間複雜度都O(n)。也因爲有這樣的情況,所以開始設計出二叉搜索樹、AVL平衡樹、紅黑樹等數據結構。讓時間複雜度儘可能平衡到O(logn)。
  • 詳細https://bugstack.cn/md/algorithm/data-structures/2022-07-22-linked-list.html

07:HashMap 負載因子的使用

08:ThreadLocal 解決哈希碰撞的散列算法?

09:HashMap 鏈表轉紅黑樹條件

10:關於 ArrayList 和 LinkedList 插入1000萬個元素性能對比

2. 源碼-Java(11~20)

01:JDK創建代理的方式

02:volatile 關鍵字的作用

03:Integer.toHexString("".hashCode()) 輸出結果?

04:哪些是公平鎖實現方式?

05:Synchronized 和 ReentrantLock 的描述

06:Thread.start()的啓動過程包括?

07:Thread 線程狀態包括?

08:線程池拒絕策略包括?

09:JDK 常用命令敘述錯誤的是?

10:JVM 虛擬機運行時數據區包括?

3. 源碼-Spring(21~30)

01:Bean 對象容器使用的是?

02:InstantiationStrategy Bean 對象的實例化策略有哪些?

03:資源解析的類型包括

04:BeanPostProcessor 與 BeanFactoryPostProcessor 的作用範圍

05:向虛擬機註冊鉤子的作用?

06:Aware 感知接口的實現類包括?

07:FactoryBean 和 BeanFacory 的用途

08:如何實現一個容器事件

09:AOP 切面如何攔截方法

10:哪一級存緩存放代理對象

4. 源碼-MyBatis(31~40)

01:MapperProxy 的作用是什麼?

02:解析的SQL語句存放到哪裏?

03:池化數據源的目的是什麼?

04:Executor 執行器提供哪些方法

05:MyBatis 框架中值的設置

06:參數的處理和結果集的封裝,用到了什麼設計模式

07:#{}與${}的區別是什麼?

08:Insert 返回自增索引

09:Plugin 插件功能作用範圍

10:緩存的作用範圍

  • 選項
    • A.一級緩存作用於 SqlSession
    • B.一級緩存作用於 namespace
    • C.二級緩存作用於 namespace
    • D.二級緩存作用於 All 全局查詢
  • 答案:A、C
  • 解析:一級緩存是作用在 SqlSession 會話層面的,一次會話結束(commit、rollback、close)後緩存就結束了。而二級緩存則是作用到 namespace 範圍,通過裝飾一級緩存,把數據保存到隊列中進行使用。那麼你知道這是一種什麼隊列嗎?爲什麼二級緩存並不常用?
  • 詳細https://bugstack.cn/md/spring/develop-mybatis/2022-07-05-%E7%AC%AC19%E7%AB%A0%EF%BC%9A%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98.html

5. 設計模式(41~50)

01:設計模式分類

02:設計模式原則包括

03:多支付渠道與多支付方式,建議使用哪種設計模式

04:MyBatis 二級緩存對一級緩存的上層實現,使用的什麼設計模式

05:規則樹人羣過濾,建議使用什麼設計模式實現

06:不太常用的設計模式組合

07:模板模式的重點

08:建立起 MyBatis 和 Spring 的連接

09:各類優惠券;直減、滿減、免息等包裝使用,需要什麼設計模式

10:單例模式實現方式包括

6. 系統架構(51~60)

01:創建工程框架包括

02:引入Dubbo到框架中,爲什麼需要單獨分出RPC的模塊層

03:分佈式框架技術棧包括

04:DDD領域服務包括什麼

05:低代碼能解決什麼場景問題

06:Zachman框架的六個觀點

07:中臺設計通常分爲

08:中臺的實現難度主要包括

09:非入侵的系統監控設計需要哪些技術棧

10:軟件設計原則康威定律包括

  • 選項
    • A.組織溝通方式會通過系統設計表達出來
    • B.時間再多一件事情也不可能做的完美,但總有時間做完一件事情
    • C.線型系統和線型組織架構間有潛在的異質同態特性
    • D.大的系統組織總是比小系統更傾向於分解
  • 答案:A、B、C、D
  • 解析:康威定律 (康威法則 , Conway's Law) 是馬爾文·康威1967年提出的:"設計系統的架構受制於產生這些設計的組織的溝通結構。"
  • 詳細https://zh.m.wikipedia.org/zh-hans/%E5%BA%B7%E5%A8%81%E5%AE%9A%E5%BE%8B

7. 中間件(61~70)

01:中間件分爲哪些類

  • 選項
    • A.終端仿真/屏幕轉換中間件
    • B.數據訪問中間件
    • C.遠程過程調用中間件
    • D.消息中間件
    • E.交易中間件
    • F.對象中間件
  • 答案:A、B、C、D、E、F
  • 解析:中間件的分類有很多中,這可能也是讓大家在平常的開發中迷惑,到底哪些是中間件。一些基本的中間件定義很好定位,比如MQ、RPC、Dapper等等,但有些軟件服務雖然不是作爲中間件開發出來的,但它們如果符合中間件的定義,也可以歸納到中間的範疇裏。
  • 詳細https://bugstack.cn/md/assembly/middleware/%E7%AC%AC%201%20%E7%AB%A0%20%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html

02:非業務邏輯的共性服務功能

03:SpringBoot Starter 如何加載自定義配置(resources/META-INF/spring.factories)

04:ES 查詢方式

05:Dubbo 通信方式

06:數據庫路由分庫分表散列算法

07:分佈式任務調度實現技術

08:字節碼增強的框架

09:RPC-Dubbo 泛化調用的使用場景

10:IEDA Plugin 開發完成後如何提交到市場

8. 網絡通信(71~80)

01:NIO 通信模式

02:Netty 的優勢有哪些?

  • 選項
    • A.使用簡單:封裝了 NIO 的很多細節,使用更簡單。
    • B.功能強大:預置了多種編解碼功能,支持多種主流協議。
    • C.性能高:通過與其他業界主流的 NIO 框架對比,Netty 的綜合性能最優。
    • D.穩定性好:Netty 修復了已經發現的所有 NIO 的 bug,讓開發人員可以專注於業務本身。
  • 答案:A、B、C、D
  • 解析:Netty 官網描述其特點;使用方便、效率高、安全的介紹。這也是大家都喜歡使用 Netty 的原因。
  • 詳細https://netty.io/

03:Netty 的應用場景有哪些?

04:Netty 高性能表現在哪些方面?

  • 選項
    • A.多線程Reactor反應器模式
    • B.內存零拷貝
    • C.內存池設計
    • D.對象池設計
  • 答案:A、B、C、D
  • 解析:Netty 的設計表現爲;更高的吞吐量,更低的延遲、更少的資源消耗、最小化不必要的內存拷貝。
  • 詳細https://netty.io/

05:Netty 和 Tomcat 的區別?

06:半包粘包協議的使用

07:Netty 流量整形處理類

08:Netty 使用 SSL 通信的作用

09:IM 通信;登錄、驗證、文件、表情、消息多協議處理

  • 選項
    • A.定義通信一些包,含有針頭和標記位
    • B.自定義繼承實現 ByteToMessageDecoder 攔截標記指令
    • C.通過指令獲取對應解析序列化操作
    • D.每個對應的消息處理器實現類 SimpleChannelInboundHandler 接收指定協議消息
  • 答案:A、B、C、D
  • 解析:一般對於 IM 通信的實現中,是需要自定義一組通信協議的,協議中要包括幀頭、幀尾、標識符、長度等信息,來方便你完成半包粘包以及不同協議的處理。
  • 詳細https://bugstack.cn/md/project/im/2.2%EF%BC%9A%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE%E5%8C%85%E5%AE%9A%E4%B9%89.html

10:Netty ChunkedStream 數據流切塊傳輸的目的

9. 實戰項目(81~90)

01:分佈式下保證冪等性實現

02:什麼情況下分庫分表

  • 選項
    • A.TPS、QPS、GMV、PV、UV等數據指標,增速較快
    • B.數據增量很大,數據庫連接數擴容不能滿足
    • C.存量數據較大,熱數據不多
    • D.單體應用承載了過多的業務訴求,業務又增量加快
  • 答案:A、B、D
  • 解析:對於存量數據較大,但熱數據訪問不多的情況下,大部分是通過遷移來解決,而不是引入分庫分表提高系統的開發成本來處理。
  • 詳細https://bugstack.cn/md/zsxq/material/interview.html

03:商品秒殺獨佔競態鎖

04:抽獎概率 0.0000001 很小如何設計

  • 選項
    • A.採用 Redis 存放一個對應概率碼
    • B.建立一個超大的 HashMap 存放
    • C.通過雙色球設計,每個爲數是一組數字的組合
    • D.與運營溝通,調整方案
  • 答案:A、C、D
  • 解析:對於抽獎系統有時候運營會需要一些極小的概率的獎品,保持有但基本中不了。對於這樣的情況實現方式還是蠻多的,比如開獎多少次後才投放,或者就是提供概率。而概率又太大,所以要進行一些設計比如 Redis 提供一個對應的概率碼,或者雙色球每一個位置又是N種組合。但不太合適建一個重大的 HashMap 來存放。
  • 詳細https://bugstack.cn/md/zsxq/material/interview.html

05:多種類型抽獎策略如何註冊

06:A/BTest 用途

07:MySQL 應用連接數配置

08:高併發下提供給前端H5分頁

09:項目運行較慢,重啓後就好了

10:分庫分表數據如何彙總查詢(給C端用戶使用)

  • 選項
    • A.通過編寫聯合查詢多庫的SQL
    • B.從每個庫表查詢到內存中彙總
    • C.通過binlog同步到ES,從ES查詢
    • D.以上都可以
  • 答案:C
  • 解析:通常在分佈式服務中會使用分庫分表承擔較大的數據體量,但給C端的查詢,基本不會使用複雜的 SQL 查詢,更不會關聯多個庫表,這樣會拖垮數據庫。基本合理的方式是C端查詢在有路由字段的時候都是查指定庫表,直接提供返回即可。而如果是彙總類查詢則需要基於 binlog 把分庫分表數據同步到 ES 查詢使用。
  • 詳細https://bugstack.cn/md/project/lottery/Part-5/%E7%AC%AC07%E8%8A%82%EF%BC%9A%E9%83%A8%E7%BD%B2%E7%8E%AF%E5%A2%83%20Elasticsearch%E3%80%81Kibana.html

10. 擴展問題(91~100)

01:常用的繪圖工具

02:常用的開發工具

  • 選項
    • A.IntelliJ IDEA
    • B.Navicat
    • C.Docker
    • D.JD-GUI
    • E.RDM
    • F.Postman
  • 答案:A、B、C、D、E、F
  • 解析:常用工具系列;IntelliJ IDEAJ、Navicat、Docker、JD-GUI、RDM、Postman
  • 詳細https://bugstack.cn/md/other/guide-to-reading.html

03:UML 類圖,實現的畫法

04:樹上10只鳥開一槍還剩下幾隻,你會想到什麼?

05:想把代碼寫好,都要包括哪些東西

06:如何保證需求如期交付?

  • 選項
    • A.從產品的BRD到PRD階段開始確定預期上線時間
    • B.產品、UI設計、測試、研發、交付、預發、上線等時間線規劃
    • C.每天一個固定時間開項目進度敏捷站會,對其進度,評估風險
    • D.如果是突然加需求,調整PRD等,那麼需要重新進行資源協調。
  • 答案:A、B、C、D
  • 解析:爲了保證項目的如期交付和交付質量,互聯網中會從產品的BRD、PRD、研發設計、開發、測試等各個環節進行把控。
  • 詳細https://bugstack.cn/md/zsxq/material/architecture_design.html

07:什麼是併發,什麼是並行?

  • 選項
    • A.併發:是指如何正確、高校地控制共享資源;
    • B.並行:是指如何利用更多的資源來產生高快速的響應;
    • C.並行:是指如何正確、高校地控制共享資源;
    • D.併發:是指如何利用更多的資源來產生高快速的響應;
  • 答案:A、B
  • 解析:其實有一大部分研發人員,搞不懂什麼是併發編程,甚至常把併發編程和分佈式聯繫起來。但很多的分佈式架構設計,並不是在壓榨一臺機器的性能做IO密集型運算,所以如;併發、並行、多任務、多進程、多線程、分佈式系統等,很多術語在大量的編程資料中被濫用了。
  • 詳細https://bugstack.cn/md/about/study/2022-06-19-OnJava.html#%E5%9B%9B%E3%80%81%E6%B7%B1%E5%BA%A6-%E9%80%8F%E6%9E%90%E5%8E%9F%E7%90%86

08:你覺得怎樣編碼更合理

09:你覺得我們的面試爲什麼像造火箭?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章