1. 程式人生 > >部分面試題總結3

部分面試題總結3

一、ConcurrentHashMap 介紹一下

組成單位是Segment桶,一個桶中包含有Entry陣列,類似於HashMap,一個ConcurrnetHashMap就是一個Segments陣列,包含2^n個桶。
1、在同一Segment桶中兩個執行緒進行寫操作,其中一個會阻塞等待另一個程序完成操作。
2、在同一Segment桶中兩個執行緒進行一寫一讀操作,是可以併發執行的。
3、在不同Segment桶中兩個執行緒進行寫操作,是可以併發執行的。
每個Segment桶都有一把鎖,會讓併發操作效率提高。
幾個方法:
get():
對key進行hash操作,通過hashcode定位到在哪個Segment桶物件,再次通過hash值在桶中定位到準確位置。
put():


1、對key進行hash操作,通過hashcode定位到在哪個Segment桶物件。
2、獲取可重入鎖。
3、再次通過hash值在桶中定位到具體位置。
4、插入或者覆蓋Entry鍵值對。
5、釋放鎖。
ConcurrentHashMap統計size解決一致性的問題?
size方法大概是
1、遍歷所有的Segment。
2、把Segment數量都加起來
3、把Segment修改次數加起來
4、判斷這次的修改次數和上一次的區別,大於則說明有修改,重新統計並記錄查詢次數。沒改變就返回統計結果。
5、查詢次數超過閾值,對另一個Segment加鎖,重新統計。
6、再次判斷,由於已經加鎖不會put進元素,所以肯定成功。
7、釋放鎖。

有點像樂觀鎖悲觀鎖,先假設查詢的時候不會有元素的增加,當嘗試次數大於閾值時轉換為悲觀鎖,為每個Segment加鎖保證查詢成功。

二、JMM記憶體模型

是一種抽象的規範,用來遮蔽不同硬體和作業系統的差異,讓java更好地實現跨平臺
大概樣子
在這裡插入圖片描述
1、主記憶體
相當於計算機中的記憶體,主記憶體被所有的執行緒共享,對於一個共享變數(比如靜態變數,堆中例項等),主記憶體儲存了真正的資料
2、工作記憶體
相當於計算機中的快取記憶體,每一個執行緒都擁有自己的工作記憶體,對一個共享變數來說,工作記憶體當中儲存了它的 副本,使用工作記憶體的原因
是因為直接操作主記憶體速度慢
關於volatile見上一篇

三、B-樹介紹一下

其實就是B樹,一個m階的B樹具有以下特徵:
1、根節點至少有兩個孩子
2、每個中間節點都包含k-1個元素和k個孩子。其中m/2<=k<=m
3、每一個葉子節點都包含k-1個元素,其中m/2<=k<=m
4、所有的葉子節點都位於同一層。
5、每個節點中元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃
為什麼要用B樹
查詢速度快是因為高度短。如果是二叉平衡樹可能會找的很深,進行多次IO讀取會很耗時間,B樹比較次數可能大於二叉平衡樹,可這樣耗時遠遠小於IO讀取。
在增加或刪除元素時可以維護自平衡,主要應用於檔案系統、部分非資料庫索引(MongoDB)

四、B+樹介紹一下

一個m階的B+樹具有以下特徵:
1、有k個子樹的中間節點包含有k個元素(B樹是k-1個元素)每個元素不儲存資料,只用來當索引,所有的資料都儲存在葉子節點。
2、所有的葉子節點中包含了全部元素的資訊,每一個葉子節點都帶有指向下一個節點的指標,形成了一個有序連結串列。
3、每一個父節點的元素都出現在子元素中,是子節點最大(或最小)元素。
和B樹的區別
1、在B樹中,無論中間節點和葉子節點都帶有衛星資料(即索引元素指向的資料記錄,比如索引指向資料庫中某一行,而在B+樹中,只有葉子節點帶有衛星資料,其餘中間節點僅僅是索引,沒有資料關聯。
2、由於B+樹中間節點沒有衛星資料,同樣大小的磁碟頁可以存放更多資料。如果B+和B樹資料量相同,B+更加矮胖,查詢IO操作更少
3、B+樹查詢必須查詢到最後的葉子節點,而B樹找到匹配元素即可,無論在哪。
4、B樹的查詢效能不穩定,根據查詢內容會變化,B+則是很穩定。
5、進行範圍查詢時,B樹要查詢到兩個節點之間的元素,要做很多遍歷操作,而B+樹直到找到邊界元素根據連結串列遍歷即可。

五、TCP 三次握手四次揮手

三次握手:
傳送方傳送SYN資料包
接受方傳送SYN/ACK資料包
傳送方傳送ACK資料包
四次揮手:
A-B打電話
A說話,說完了
B知道了
B說話,說完了
A知道了

六、IP地址和MAC地址區別

IP地址:網際網路協議地址,用於遮蔽不同計算機的物理硬體的差異
MAC地址:計算機網絡卡硬體地址,用來定義網路裝置的位置