與大佬談話心得體會

最近一直沒有寫博客,一直在準備面試,阿里(三面)網易(一面)都被刷了,說實話心情還是蠻難受的…

昨天,我叫我哥能不能幫我找些大牛聊聊項目,給點意見,指點指點。

說實話我一直想進阿里,看着身邊的同學很多都拿到大公司 offer 阿里集團、支付寶、菜鳥、網易… 而我(可能能拿到華爲的目前還不知道那就是 0 offer)對比起來說實話心裏還是有點難受的爲什麼我這麼菜。

昨天和那個大牛聊了後發現差距在哪裏,我先問他:“我現在覺得有個好項目還是很重要,不過感覺自己實習做的東西基本是 CRUD 都沒什麼難點,我面試的時候說了基本面試官都不太敢興趣? 不太敢興趣,基礎知識就問的多了,一問多了很多知識點自己就沒有準備好一下子就….”

大佬:其實我更加註重基礎,基礎可以看出一個人可塑性如何? 給我看了下他經常問的一些問題。

我哥:你們就當一個面試吧,我走開你們慢慢聊。

大佬:好吧,那就先第一個問題吧! ArrayList 和 LinkedList 的區別?

我:ArrayList 底層使用數組實現,查找比較快,插入刪除因爲要移動位置相對來說慢點,LinkedList 底層使用雙向鏈表實現,插入刪除比較快,查詢比較慢。

大佬:好,描述下這兩個的 add()?

我: ArrayList 的 add()當添加元素是需要檢查下是否到達了閥值需不需要擴容,LinkedList 使用雙向鏈表實現的 插入的時候 new 一個結點插入就可以。

大佬:使用 ArrayList 和 LinkedList 當插入 100 萬條數據時哪個更快?

我 :LinkedList 快因爲它插入只需要 new 對象然後插入,而 ArrayList 插入的時候需要檢查擴容。

大佬: 你又嘗試過嗎? 真的是這樣嗎?

我: 沒,我感覺是這樣的….

大佬: 其實是 ArrayList 快,你可以去測一下,有一段是LinkedList快,好像到達 70~80 萬(我記不清是不是這個數)的時候 ArrayList 會更快。 你知不知道熱加? 你可以跑下,當你第一次跑完時間,和第二次跑完時間是不一樣的,第二次第一次更快,因爲cpu寄存器裏面還存在一些東西(我記不清楚了),說了下 junit 和(我記不清是不是jmock還是jmp)區別啥的… 後面還講了些我實在沒記住(應該拿筆記下的)

我: 點頭,佩服佩服


第二個問題

大佬:談下 Map 吧

我:Map 是一個接口定義了些方法,AbstractMap 抽象類實現了 Map 接口,我用的比較多的是 HashMap、LinkedHashMap。

大佬: 還有嗎?

我:HashTable、ConcurrentHashMap … 額…

大佬:NavigableMap 知道不?

我: 聽說過沒用過?

大佬: 你應該這樣回答,Map 主要是以 k,v 形式存放數據,再講下它的樹形結構(分支),再談談用的比較多的幾個類。

大佬:比如這樣一個情景: HashMap,用 get 方法如果集合中有元素存在就返回 V 的值,如果沒有用 put 方法 把時間戳給寫入,多線程會有什麼問題?

我:如果集合中有通過 get 方法有元素已經存在,多線程相當於讀操作是安全的,如果比如說有兩個線程 get 的時候元素都不存在 都要 put,那麼一個元素的 V 會替換另外一個元素的 V。

大佬:還有嗎?這是一種情況

我: 不知道了

大佬:你知道 HashMap cpu 100% 嗎?

我: 聽說過,好像在擴容的時候

大佬: 去看下

大佬:那麼如何保證線程安全呢?

我: 用 ConcurrentHashMap ,Collections.synchronized方法

大佬: 其實是線程不安全的,解釋了下…..

我: 沒聽懂

我: 是不是用鎖把,get 和 put方法鎖起來

大佬: (怎麼說我忘了)


第三個問題

大佬:synchronized 關鍵字 和 Lock 的區別?

我:synchronized 關鍵字是 jvm 層面上編譯會自動加鎖解鎖(我在牛客上一個人回答上看的,不過大佬好像疑惑了下有問題),Lock 是 jdk 層面上的,需要自己加釋放鎖。synchronized 好像是JDK1.6 後做了鎖優化:鎖粗化、自選鎖等等,性能上並不比 Lock 差推薦使用 synchronized
synchronized 和 wait(),notify(),notifyAll 結合使用,Lock 結合 Condition,await(),singnal(),signalAll(),Lock 還有 tryLock()方法,Lock 可以實在公平鎖和非公平鎖,synchronized 是非公平鎖。

大佬: 還有嗎?

我:差不多就這樣了。

大佬:你應該先講他們的使用,再將它們差別。使用大佬講了很多,InterruptedException啥的 記不清楚,還深入講解了 synchronized 和 Lock 底層實現 幾種狀態…


第四個問題

大佬:談談類加載器吧

我: 類加載過程:加載、驗證、準備、解析、使用、銷燬。在 JVM 中確定一個類的唯一性由類加載器和類本身。 然後講了雙親委託,4個類加載器,如果沒有找到就會通過自己加載 findclass,類名稱轉化爲字節碼,defineclass 返回 Class 對象。

大佬:用過 Tomcat 嗎?

我:用過

大佬:知道 Tomcat 什麼加載和什麼加載(我記不清楚了)的區別嗎?

我:不是很清楚

大佬:破壞雙親委託的方式?

我:我記得有個contextClassLoder 在 jdbc 加載第三方庫 JNDI,會調用線程類加載器…

大佬:其實 tomcat 那兩個就是破壞了雙親委託,解釋瞭如果破壞….(講了很多 蠻多沒聽懂)


第五個問題

大佬:還知道啥新技術嗎? Docker知道不?

我:我瞭解 Docker 和虛擬機區別

大佬:瞭解就不問了,沒使用過,就不多問了。

大佬: 你平時在學校做的應用是怎麼發佈的?

我:就是一臺服務器,環境、數據庫配置好,把war 放在webapp下面就好了,看下可不可以跑

大佬: 那一些使用軟件版本知不知道

我:知道但不太關注

大佬: 在實際中 coding 的成本是最低的,你需要關注服務系性能啥的 需要調優,比如 jvm 調優 堆內存啥的…


我:我是不是隻能達到平均水平

大佬: 你比平均好一點(客氣話),你回答需要是我眼前一亮,纔會留下深刻印象,比如第一個問題的 ArrayList 和 LinkedList 添加 100 萬 數據誰快? 如果你能答上來,知道爲什麼我覺得就可以給評A,95%的人其實都不知道


總結

和大佬聊完後回去想了很多,覺得 7 月 10 多號開始到現在一個多月的準備其實感覺是功利主義的追求,自己理解的很多東西都是深入都是皮毛了解。突然想到了考研時朱偉老師的那句話:少一些功利主義的追求,多一些不爲什麼的堅持。 我哥和我說你不一定要進阿里啊,其它小公司也可以主要是你能學到啥,進了阿里有些你一直搞業務其實學到的並不是很多,小公司有小公司好大公司有大公司好(我知道我哥是在安慰我)。

說實話我想進阿里,想進大公司。但是看看自己現在的能力,真不行。想想這段時間的有點功利性的學習。 好好反思反思!

少一些功利主義的追求,多一些不爲什麼的堅持。

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