2019秋招Java面經(未完待續)


2019秋招Java面經(憑記憶回憶, 可能不准)

隨着我們從大三升到大四...秋招也開始了. 秋招進行的還比較順利, 剛開始沒幾天, 我的秋招就結束了.

到現在我玩了差不多十多天了, 總想着總結一下面經, 一直懶. 現在就以這篇面經來宣告我的秋招結束吧.....

我在整個秋招期間在技術面沒有掛過(貝殼 去哪兒 美團 百度, 百度金融. ...), 不喜歡收割offer, 覺得沒意思而且浪費時間, 我只去參加自己中意的公司的面試.

而且我也不看錢(年薪二十萬以上就可以了, 掙大錢是以后的事情[最終拿到的最低的offer年薪22萬]), 我現在更關注公司的技術對我的發展會不會有很多幫助. 

學歷情況

雙非, 本科

算法學習情況

劍指offer只看了前4道題  (現在是看到了第9題了).

左程雲的書只看了前2道題.

貝殼 提前批一面(大概80分鍾?)

這是我秋招面的第一個公司, 而且也是發揮最好的面試. 完全由我自己發揮, 讓我發揮自己的擅長之處.

1.面試官笑

我傻笑

2. 請你自我介紹吧

balabala.....(我哪方面怎么怎么厲害, 多厲害什么的)

3. Java集合你都熟悉哪些

util包下的基本都說了...看過幾個源碼

4. 請你介紹一下HashMap和jdk里與其結構相似的集合

        1> 我就講了講Hash的沖突解決方法都有哪些, HashMap采用的是鏈表解決...紅黑樹優化....為什么是8, 泊松定理什么的....

        2> 負載因子和擴容策略, 連續擴容到64之類的...也就是介紹了各個變量的作用..

        3> 然后說了說 jdk7 和 jdk8 兩個版本之間HashMap的區別.

        4> 講了講和HashTable的區別.

        5> 和ConcurrentHashMap的區別.

        6> 和IdentityHashMap的區別,

        7> 和WeakHashMap的區別. 然后聊了一下Weak弱引用.

        8> 接着又說了HashSet等set集合底層使用的是HashMap.

5. 講講你實習中在公司做的這個項目.

balabala....

(就是涉及到:

       1> 分布式

       2> netty

       3> rpc

       4> protobuf

       5> http

       6> redis

       7> 手寫lru緩存和優化

這幾個關鍵詞...)

6. 你對synchronized關鍵詞的了解和對並發的看法.

談了一下多線程的概念, 線程和進程的區別. 舉了一個死鎖的demo, 舉了一個線程不安全的demo.

然后我就開始介紹synchronized關鍵詞, 我還比較擅長這塊, 就答得比較多:

     1> 講了講鎖的語義.

     2> synchronized關鍵詞加在成員方法上的時候, 底層是在方法表的訪問標志中增加了ACC_SYNCHORONIZED.

     3> synchronized關鍵詞用在代碼塊的時候, 底層是直接在上下代碼中插入了monitorenter和monitorexit. 

     4> 其實本質上都是moniter.

     5> 還講了一下synchronized加在靜態方法(類方法)上和成員方法上的區別.

     6> synchronized相關的知識點--對象頭結構

     7> 偏向鎖  輕量級鎖  重量級鎖的 場景和升級的情況. 而且只可升級不可降級

     8> synchronized相關的jvm參數   比如關閉偏向鎖 -XX:UseBiasedLocking=false  之類的...還有更改默認自旋次數的一個...忘了...

     9> wait()方法的底層實現. 講了講底層的 _EntryList  和 WaitSet

    10> 說了說我的理解: 為什么對象都可以作為synchronized代碼塊的鎖. 為什么wait方法是在Object類下

     11> 和lock的區別. 比如不能響應中斷什么的...

     12> 鎖的粗化

     13> 鎖的細化

     14> 自旋優化

     15> 鎖消除. 用StringBuffer舉的例子.

7. 寫個sql查詢.

我: sql不太會, nosql比較會. 

面試官: 沒事, 給你個簡單的倆表連接查詢

8. nosql你是熟悉哪種?

我: redis

9. 講講redis任意一個數據結構吧

我挑了最簡單的SDS講的...跟java的AbstractStringBuilder作對比, 講了講兩個的擴容策略和細節上的區別.

10. redis的字典和java的HashMap做個比較吧

(我當時沒想出來...面試官說了值后我才想起來....擴容的時候增量同步之類的...)

11. redis的持久化

講了兩種持久化的格式, 和優缺點, 和新版的優化. (之前可以肉眼看持久化文件的, 所以就講了講持久化文件的格式....現在不行了, 好久都忘了)

12. 線程池你用過嗎?

我就介紹了一下java的線程池ThreadPoolExecutor里的每個參數...

13. 介紹一下線程池的拒絕策略...

我就講了jdk實現的四種. 然后講了一下我再github上看到的另一種實現...就是放進新隊列里, 以更低優先權的方式進行調度.

14. 線程池什么時候回收線程? 怎么回收線程?

這塊沒答好....不太會...

15. 鏈表如何優化查詢效率

跳躍表

16. 來寫個代碼吧. 手寫個小算法. 兩個有序鏈表合並為一個有序鏈表.

送分題...假裝不會...一臉認真地寫....

貝殼 提前批二面(大概一個小時)

貝殼二面面試官人很直爽, 很不錯. 只是對我簡歷中的第二個項目很不滿意, 而且我表述又不清. 聊得很不好.

1. Java反射, 比如如何修改一個變量. 如何修改static+final同時修飾的變量.

因為static和final同時修飾時, 直接用反射是無法進行修改的..回報異常. 應該反射Method來去掉final修飾符. 然后用反射來修改該變量. 修改完了后再反射Method把final修飾符加上.

2. 你為了這個項目自己實現了一個Objenesis? 講講唄. 為什么這么做...

從這里開始和面試官聊得很不來....一直在聊項目....

3. 談談你項目的架構.
從客戶端到緩存到redis持久化和mysql持久化等等, 一致性hash等等....

4. 你還有沒有什么問題

有. 講了講面試中的誤解. 面試官說我不能答到問題的點上. 說我技術本身沒有大問題, 說我的溝通能力很差.

我就解釋了一下我母語不是中文, 面試官突然驚訝一下...

二面還是給我通過了...

貝殼 hr面(大概20分鍾)

1. 你是哪里人

2. 對加班的看法

3. 為什么不留在上一家公司(我實習的公司)

4. 你還有什么問題?

我: 沒有

去哪兒網 一面(大概80分鍾)

1. 自我介紹

2. 講解項目

         1> 一致性哈希

         2> 緩存

         3> 微服務

         4> ......

3. 來寫個算法吧

然后我沒寫出來.......

4. 寫個sql吧, 根據業務進行一個查找

墨跡了半天, 我也沒寫出來....(中間伴隨着面試官燒熱水...喝熱水...還聽到隔壁在聊布隆過濾器...   分神了)

5. linux 你用過嗎?

我: 用過, 實習的時候在服務器上查個日志什么的

面試官: 用過哪些命令?

我: grep top tcpdump

面試官: 想只要一個關鍵詞在文章中出現的行數, 怎么統計?

我: 不會....

6. 講一下HashMap吧

        1> 我就講了講Hash的沖突解決方法都有哪些, HashMap采用的是鏈表解決...紅黑樹優化

        2> 負載因子和擴容策略, 介紹了各個變量的作用..

        3> jdk7 和 jdk8 兩個版本之間HashMap的區別.

        4> 和HashTable的區別.

7. gc你熟悉嗎?

我: 一般吧(其實我還是挺擅長gc和jvm的, 我怕驕傲了不好...)

面試官: 兩個垃圾對象互相引用的時候, jvm會不會成功回收這兩個對象.

我: 會. 因為不是引用計數, 是根據可達性.

(然后就下一題了...我還想繼續往下講呢....jvm就這樣問完了....😭)

8. 數學學的怎么樣? 都學過哪些科目?

我: 線性代數, 高等數學, 復變函數, 概率論

面試官: 考你一道數學題吧

我: 數學都忘了....

面試官: 沒事, 一道概率題.  現有一個蘋果, 甲乙兩個人都想吃. 於是決定拋硬幣. 倆人輪流拋, 直到有人拋到正面為止. 誰先拋到正面, 誰就可以吃蘋果. 當甲先拋的時候, 甲有多少概率吃到蘋果. 

我: 我用本方法推出了公式...最后算極限的時候沒推出來.  最后面試官告訴了我, 甲乙第一輪都沒拋成功的時候, 第二輪重新拋的概率等於首輪拋硬幣的概率...... 

9. 數據庫分庫分表的設計

10. 千萬並發下的架構設計

11. 紅黑樹的特性和旋轉, 和AVL樹的區別

12. 又是一道手寫算法

13. 你認為你哪方面做的很好, 或者如何勝任這個職務呢?

(我知道我前面答得很差, 算法和sql和花了很久時間都沒寫出來, 基本上是掛了. 而且linux也沒答出來. 我擅長的 jvm/並發/jdk集合源碼 都沒考我...)

(我就豁出去, 自己強答了一波並發, 面試官當時在敲鍵盤, 我就自言自語了)

我就跟面試官說: 我平時學習中特別喜歡java並發相關的內容, 而且學的很底層, 保證跟其他來面試的同學講解的不一樣, 或者更底層.

然后我就講了講java cas. 從Atomic類講到jdk的c++代碼, 又講了內聯匯編. 又講了必須要在cmpchg指令的第二操作數是內存尋址時才可以加這個lock前綴.又講了cmpchg指令和EAX寄存器比較時, 成功和失敗分別對應着哪種影響.  講了講x86架構下lock cmpchg指令的作用. (鎖總線 所緩存行 總線嗅探 之類的) . 

然后又說了LockSupport下的park和unpark. 

然后說了先unpark再park會導致什么..為什么會這樣..

去哪兒網 二面

1. 假設一個人不知道netty, 你會怎么樣給他介紹, 如何使用, 以及他的優點?

2. 為什么要nio, 不用nio會怎么樣?

3. 你對異步的理解

4. 對Actor模型的認識

5. 線程和性能的關系

簡單來看的話, 多線程執行會比單線程處理要性能高. 但這不是絕對的. 就像高並發下的cas爭搶, 會導致cpu忙輪詢. 線程開啟過多, 會給cpu很大負擔. 

線程之間如果過度地進行時間片輪轉, 進行調度切換, 有時性能還不如單線程.

比如synchronized的優化, 讓同步鎖在失敗時自旋, 在少量爭搶時是一種優化, 掛起操作在少量爭搶時是一種很不必要的耗時操作. 但是高並發下, 大規模的cas任務失敗, 反而會加大cpu負擔, 大部分的失敗應該直接悲觀地掛起, 這樣會減輕cpu的負擔.

6. 線程池的活躍線程個數訂制在多少個比較合適? 需要考慮哪些因素?

7. 字符串, 動態規划, 背包. 三道題你選一個手寫代碼.

去哪兒網 hr面

1. 你平時寫代碼是喜歡自動導入代碼, 還是喜歡每一個字母都手敲?

2. 開始講公司福利

3. 現場發offer

美團 

【2019年4月16日更新】

過了半年,面試內容忘了...沒有及時記錄下來。我就簡單記錄一下面試中的幾個難題吧。

一面面試官,問我protobuf的原理,讓我設計一個類似的框架進行rpc操作

二面面試官,問了點cas的東西,我給他講了atomic包里的實現。

三面面試官,問了happen before,java內存模型,設計模式,以及每個設計模式用和不用的區別。

百度金融(度小滿)

回憶中...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM