
螞蟻一面
- 二叉搜索樹和平衡二叉樹有什么關系,強平衡二叉樹(AVL 樹)和弱平衡二叉樹(紅黑樹)有什么區別?
- B樹和B+樹的區別,為什么MySQL要使用B+樹?
- HashMap 如何解決 Hash 沖突?
- epoll 和 poll 的區別,及其應用場景
- 簡述執行緒池原理,FixedThreadPool 用的阻塞佇列是什么?
- sychronized 和 ReentrantLock 的區別
- sychronized 的自旋鎖、偏向鎖、輕量級鎖、重量級鎖,分別介紹和聯系
- HTTP 有哪些問題,加密演算法有哪些,針對不同加密方式可能產生的問題,及其 HTTPS 是如何保證安全傳輸的?
答案決議:(為了不累積文章篇幅,保證文章的可讀性,文中僅列出部分答案,需要的朋友,關注文末公眾號獲取!)
1、二叉搜索樹:也稱二叉查找樹,或二叉排序樹,定義也比較簡單,要么是一顆空樹,要么就是具有如下性質的二叉樹:
(1)若任意節點的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;
(2)若任意節點的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;
(3)任意節點的左、右子樹也分別為二叉查找樹;
(4)沒有鍵值相等的節點,
平衡二叉樹:在二叉搜索樹的基礎上多了兩個重要的特點
(1)左右兩子樹的高度差的絕對值不能超過 1;
(2)左右兩子樹也是一顆平衡二叉樹,
紅黑樹:紅黑樹是在普通二叉樹上,對每個節點添加一個顏色屬性形成的,需要同時滿足以下五條性質 :
(1)節點是紅色或者是黑色;
(2)根節點是黑色;
(3)每個葉節點(NIL 或空節點)是黑色;
(4)每個紅色節點的兩個子節點都是黑色的(也就是說不存在兩個連續的紅色節 點);
(5)從任一節點到其每個葉節點的所有路徑都包含相同數目的黑色節點,
區別:AVL 樹需要保持平衡,但它的旋轉太耗時,而紅黑樹就是一個沒有 AVL 樹那樣平衡,因此插入、洗掉效率會高于 AVL 樹,而 AVL 樹的查找效率顯然高于紅黑樹,

2、B樹:
(1)關鍵字集合分布在整棵樹中;
(2)任何一個關鍵字出現且只出現在一個節點中;
(3)搜索有可能在非葉子結點結束;
(4)其搜索性能等價于在關鍵字全集內做一次二分查找;
B+樹:
(1)有 n 棵子樹的非葉子結點中含有 n 個關鍵字(b 樹是 n-1 個),這些關鍵字不保存資料,只用來索引,所有資料都保存在葉子節點(b 樹是每個關鍵字都保存資料);
(2)所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標, 且葉子結點本身依關鍵字的大小自小而大順序鏈接;
(3)所有的非葉子結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小) 關鍵字;
(4)通常在 b+樹上有兩個頭指標,一個指向根結點,一個指向關鍵字最小的葉子結 點;
(5)同一個數字會在不同節點中重復出現,根節點的最大元素就是 b+樹的最大元 素,
B+樹相比于 B 樹的查詢優勢:
(1)B+樹的中間節點不保存資料,所以磁盤頁能容納更多節點元素,更“矮胖”;
(2)B+樹查詢必須查找到葉子節點,B 樹只要匹配到即可不用管元素位置,因此 B+ 樹查找更穩定(并不慢);
(3)對于范圍查找來說,B+樹只需遍歷葉子節點鏈表即可,B 樹卻需要重復地中序遍歷,

3、通過引入單向鏈表來解決 Hash 沖突,當出現 Hash 沖突時,比較新老 key 值是否相等,如果相等,新值覆寫舊值,如果不相等,新值會存入新的 Node 結點,指向老節點,形成 鏈式結構,即鏈表,
當 Hash 沖突發生頻繁的時候,會導致鏈表長度過長,以致檢索效率低,所以 JDK1.8 之后引入了紅黑樹,當鏈表長度大于 8 時,鏈表會轉換成紅黑書,以此提高查詢性能,
螞蟻二面
- 設計模式有哪些大類,及熟悉其中哪些設計模式?
- volatile 關鍵字,它是如何保證可見性,有序性?
- Java 的記憶體結構、堆分為哪幾部分,默認年齡多大進入老年代?
- ConcurrentHashMap 如何保證執行緒安全,jdk1.8 有什么變化?
- 為什么 ConcurrentHashMap 底層為什么要紅黑樹?
- 如何做的 MySQL 優化?
- 講一下 oom 以及遇到這種情況怎么處理的,是否使用過日志分析工具?
答案決議:
2、volatile 可以保證執行緒可見性且提供了一定的有序性,但是無法保證原子性,在 JVM 底層volatile 是采用“記憶體屏障”來實作的,
觀察加入 volatile 關鍵字和沒有加入 volatile 關鍵字時所生成的匯編代碼發現,加入 volatile 關鍵字時,會多出一個 lock 前綴指令,
lock 前綴指令實際上相當于一個記憶體屏障(也稱記憶體柵欄),記憶體屏障會提供 3 個功能:
I. 它確保指令重排序時不會把其后面的指令排到記憶體屏障之前的位置,也不會把前面的指令排到內 存屏障的后面;即在執行到記憶體屏障這句指令時,在它前面的操作已經全部完成;
II. 它會強制將對快取的修改操作立即寫入主存;
III. 如果是寫操作,它會導致其他 CPU 中對應的快取行無效,

3、Java 的記憶體結構:程式計數器、虛擬機堆疊、本地方法堆疊、堆、方法區,
Java 虛擬機根據物件存活的周期不同,把堆記憶體劃分為幾塊,一般分為新生代、老年代 和永久代,
默認的設定下,當物件的年齡達到 15 歲的時候,也就是躲過 15 次 GC 的時候,他就會轉移到老年代中去,既躲過 15 次 GC 之后進入老年代,
螞蟻三面
- 專案介紹
- 你們怎么保證 Redis 快取和資料庫的資料一致性?
- Redis 快取雪崩?擊穿?穿透?
- 你熟悉哪些訊息中間件,有做過性能比較?
總結
前幾天,螞蟻金服成功上市,曾經在阿里埋頭996的程式員終于恰到“福報”了,
看了以上的面試問題,你能答出來多少?進阿里是否真的有想象中的那么難?



我這里已經整理好了完整答案,還有許多大廠面試真題、技術分類面試題,供大家沖刺刷題用,需要的朋友關注下方公眾號獲取

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/4677.html
標籤:其他
