搞清楚這3個基礎的(快)技術問題,你離高薪offer就差一個面試

曾經看過不少面試經,對程式設計師面試也做過簡單整理,幾個看似不起眼的問題卻決定你的去留!

0,HashMap為什麼快?

這個問題看似簡單,卻是個大眾化的問題,這個問題基本上從初級開發到中級再到中高階面試中都會有問道,可能問的方式不同但究其根本都是在問HashMap的底層實現。下來簡單給大家分析一下它為什麼快!先來看看HashMap的快的幾個核心因素:

搞清楚這3個基礎的(快)技術問題,你離高薪offer就差一個面試

我們知道,陣列在記憶體中是一塊連續的儲存空間,可以根據索引快速的獲取當前的元素,時間複雜度為O(1),HashMap正是借用資料的這種高效率特性完成自身的對資料讀取O(1)的複雜度。但是由於陣列也存在很多問題,比如需要大量的連續連續空間,插入操作代價非常高,而且定義之後長度不能改變等問題。 當然HashMap也為此做了很多最佳化,以下是一些關鍵點:

使用陣列+連結串列組合方式儲存,藉助陣列實現高效讀,連結串列實現高效寫;

僅使用陣列儲存物件引用;

透過對key進行雜湊快讀定位元素位置,陣列引用的是一個連結串列(JDK1。8做了最佳化,在連結串列長度大於8時轉為紅黑樹);即使在雜湊衝突的情況下,時間複雜度也小於等於 Nlog(N)。

動態擴容。

JDK1。8解決擴容時因節點順序反調而引起的死迴圈問題。

執行緒安全請採用ConcurrentHash。

1,單執行緒的redis為什麼快?比c語言還快?

幾乎所有的面試都會問到這個問題,單執行緒還這麼快?基於一下幾點:

所有操作,資料都是基於記憶體,資料也儲存在記憶體中,對記憶體的操作當然快!

資料結構為快而生,簡單舉個例子,動態字串(SDS),我們看一下它的結構:相比較於C語言的字串,SDS多儲存了字串本身的長度資訊,使得獲取字串的長度不在需要遍歷字串本身。

搞清楚這3個基礎的(快)技術問題,你離高薪offer就差一個面試

採用單執行緒,避免執行緒切換引發的問題;不用考慮鎖機制,多路複用非阻塞IO模型。

底層通訊協議最佳化。

2,mongodb快麼?

快!直接來乾貨:

硬碟無關性,記憶體,記憶體還是記憶體!!資料儲存在硬碟上起了非同步執行緒,這個不影響我們直觀上mongodb的快,寫資料直接寫到記憶體就返回,mysql是寫入硬碟之後才返回。

文件模式的設計使得同類資料非常集中,mongdb啟動之後會將資料以檔案對映的方式載入到記憶體中,相當於快取,我們都知道記憶體操作效率遠遠高於IO操作,讀取速度當然非常快了。

非結構化的資料使得增加列更快更靈活,這一點mysql是沒法比的。

支援快速擴充套件,和分散式叢集設計完美集合。

搞清楚這3個基礎的(快)技術問題,你離高薪offer就差一個面試

這篇文章就簡單說這麼多,如果想認真研究redis請看《redis的設計與實現》。mongodb實戰。

大家好我是程式設計師大狂客,分享幫助我們成長。