記某電商互聯網公司java高級工程師面試

寫文章前感謝帥丙,對我技術棧的深度有很大的幫助(尤其是redis)

文章中的回答不是標準答案,是本人當時的回答

 

一面

面試官:簡單介紹下你做過的項目。

小白:略(主要是SpringCloud,redis,消息隊列)

面試官:ok,那我先問點基礎的東西,瞭解設計模式嗎?

小白:用到的有單例模式,工廠模式,觀察者模式。

面試官:單例模式你能說下有哪幾種實現方式嗎?

小白:懶漢式,餓漢式,雙重校驗。

面試官:HashMap的數據結構瞭解嗎?

小白:jdk1.7是數組+鏈表,jdk1.8是數組+鏈表+紅黑樹。鏈表擴充到size=8就將鏈表轉化爲紅黑樹,頭插入改爲尾插入。

面試官:假設我這批數據剛好恰巧都插入到了一個鏈表裏,怎麼辦?

小白:那就擴容吧。

面試官:除了擴容呢?

小白:可以重寫hashcode方法嗎?

面試官:可以,這就是我想要的答案。那你說說在判斷對象相等的時候爲什麼要重寫equals和hashcode方法?

小白:比如這兩個對象相等,只重寫equals方法而不重寫hashcode方法在放入map的時候就會發現這是兩個key,與兩個對象相等相違背,造成困擾

面試官:hashMap支持併發嗎?

小白:不支持,可以用hashTable和concurrentHashMap來替代。

面試官:那你說說他倆的區別

小白:hashTable是在hashMap的基礎上,在方法上加上synchronized鎖,concurrentHashMap在jdk1.7時採用segements做分段鎖,jdk1.8時採用synchronized+CAS鎖來實現

面試官:CAS鎖怎麼實現?

小白:用volatile標記變量,保證可見性,確保每次拿到的數據是最新的數據,在更新的時候再做比較,如果之前沒有發生過變更,再update。

面試官:這是樂觀鎖還是悲觀鎖?

小白:樂觀鎖。

面試官:項目中的redis分佈式鎖怎麼實現?

小白:根據請求id和自定義key去生成,把他作爲一個key放入redis中,完成操作以後再刪掉釋放鎖。

面試官:那我要是沒完成操作怎麼辦?不是就形成死鎖了?

小白:key會設置過期時間。

面試官:刪掉key是直接delelte key嗎?

小白:不是,爲了確保原子性是將luna腳本放置到redis裏執行。

面試官:redis和memoryCache有什麼區別?

小白:redis支持持久化,memoryCache不支持,如果掛掉了裏面的數據就全沒了。

面試官:還有呢?

小白:我對memoryCache不太瞭解,沒用過。

面試官:redis是單線程的還是多線程的?

小白:應該是單線程的吧

面試官:是的,自信點,不然怎麼實現分佈式鎖呢。你們設備指令下發怎麼保證安全性呢?如果被截取了不是可以輕鬆破解嗎?

小白:發送的數據是加密的。

面試官:你都知道哪些加密方式呢?

小白:比如MD5,單向加密,像數據庫存放密碼不可能存放明文,所以一般存放md5加密後的數據。還有RSA加密,他是用公鑰加密,私鑰解密,所以他是可以獲取到明文的。

面試官:線程池有了解過嗎?怎麼實現。

小白:可以用Executors獲取線程池,也可以new threadPoolExecutor。

面試官:他倆有啥區別嗎?

小白:前者在阿里開發規範裏被否定了,因爲會無限擴容,所以更推薦後者。

面試官:那你知道threadPoolExecutor有哪些參數嗎?

小白:存活線程數,最大線程數,然後兩個是失效時間,一個隊列,還有線程工廠和錯誤策略。

面試官:你有什麼想問的嗎?

小白:有技術分享會嗎

面試官:這個是有的,每週都會定期舉辦分享會,有很多大牛會介紹自己的經驗。

 

 

二面

面試官:介紹下你的項目經歷

小白:略。

面試官:之前有碰到過高併發的場景嗎?

小白:有的,設備指令同時批量下發,打崩過數據庫。

面試官:爲什麼會打崩

小白:因爲同一時間大面積的reids key失效,所有的請求都打到了數據庫。

面試官:怎麼解決的呢?

小白:分批去處理數據,岔開redis key的失效時間。

面試官:這麼大的問題之前沒有發現嗎?

小白:這個是發生在開發環境的,生產環境不會出現這個問題。

面試官:你們redis是怎麼實現的?

小白:用AOP攔截大屏的接口,如果redis裏有數據就返回,如果沒有再訪問數據庫。

面試官:我看你項目經歷有調優經驗,那你說說如果一個接口返回比較慢了怎麼入手調優?

小白:先打斷點,看看主要耗時在哪裏,如果是後臺處理的慢,則要具體分析,改代碼,如果sql執行慢就要分析sql,重寫sql或者建立索引。

面試官:sql慢你怎麼分析呢?

小白:可以打開慢查詢日誌,確認到執行慢的sql然後explain,看他有沒有走索引,還是全表掃描了。

面試官:explain主要看哪幾個參數?

小白:有個rows代表掃描走過的行數,其他好像還有什麼all,如果出現了all就代表全表掃描了。

面試官:索引失效瞭解嗎?談談什麼場景下會索引失效

小白:比如用in ,not in,或者在索引字段上做計算函數都有可能發生索引失效。

面試官:聯合索引什麼情況下會失效呢?

小白:如果建立的時候是A,B那麼查詢的時候用B,A就會失效。

(後面問了很多場景,比如CBA,BCA)

面試官:有做過壓力測試嗎?

小白:有的

面試官:主要看哪些指標呢?

小白:QPS,還有錯誤率。

面試官:如果壓測效果不好怎麼辦呢?

小白:前端限流,後端限流,jvm設置併發線程數。

面試官:我看你用的項目是springcloud,熔斷降級怎麼實現?

小白:引入Hystrix,然後他可以去攔截錯誤的接口,返回定義好的錯誤返回。

面試官:你瞭解哪些熔斷的參數呢?

小白:有個分鐘數,錯誤次數,熔斷時間吧。

面試官:那你怎麼提高你接口的吞吐量呢。

小白:利用eureka做負載均衡,比如設備模塊這種併發量高的可以多啓動幾個微服務。

面試官:負載均衡的分配策略有哪些呢?

小白:輪詢,隨機,併發數最少,那幾個英文忘掉了。

面試官:當初爲什麼選擇SpringCloud呢?dubbo也可以啊

小白:確實可以,但是當時比較尷尬,dubbo還沒有被阿里重啓,而且dubbo用的是RPC,springCloud用的是http,大家又對spirng更熟悉,所以選用了SpringCloud

面試官:談談你對RPC呢?

小白:是遠程進程調用。具體我也不太清楚

面試官:Java怎麼實現RPC呢?

小白:不會

面試官:開發工具用的什麼?

小白:IDEA

 

 

 

三面

面試官:介紹下項目經驗

小白:略

面試官:你們sql最大的表有多少數據?

小白:幾十萬。

面試官:我看設備一直上報數據,表裏無限增長,爲什麼數據量那麼少。

小白:做了冷熱數據分離,數據庫裏只保留三天的數據,之前的數據寫成csv按照日期作爲文件名存儲起來

面試官:那我想要一個月前的數據怎麼辦?

小白:我們提供了接口獲取數據,csv裏保存的是json數據,所以依舊是可以查詢的。

面試官:那相對於sql查詢肯定慢很多吧。

小白:那是肯定的,所以儘量支持一些數據段提取,不要有什麼複雜的操作,類似於tsdb。

面試官:你覺得你有什麼缺點呢?(送命題)

小白:比較犟,跟同事會對方案要吵出一個最優解來。

面試官:如果就事論事的話我還是支持的,但是要注意說話的方式,儘量溫和一點。那你覺得你的優點呢?

小白:接受新事物能力比較強吧,近期公司讓我開發一些前端內容,雖然之前沒接觸過也可以照葫蘆畫瓢。

面試官:那你平時學習一些技術都是靠哪些渠道呢?

小白:csdn,微信公衆號比如像阿里技術,架構之路之類的,github會看些項目相關或者類似的項目。

面試官:你不看一些專業書嗎?

小白:相比專業書我更喜歡看史書。因爲現在技術更新換代太快了,可能我看完一本書實現原理又變了,比如hashmap jdk1.7和1.8的區別。

面試官:看書其實可以訓練你的編程思維,單純看一些文章的話很多情況下會忘記,最好看完之後code一下,才能鞏固

小白:瞭解

面試官:你對加班有什麼看法呢?

小白:我覺得互聯網人加班是很正常的,自己的事情幹好了再下班。但是我比較反感明明沒事還裝作有事在那加班,或者自己能力不行然後裝可憐。

面試官:之前有帶過人嗎?談談項目從立項到完結的流程

小白:略(各公司不一樣)

面試官:你有什麼想問的嗎?

小白:既然提到加班,我想問下公司績效和加班時間掛鉤嗎?

面試官:肯定不掛鉤的。

小白:那我這邊沒問題了

面試官:等hr聯繫

 

 

 

總結一面面的比較廣,主要是對項目中用到的技術做個大致瞭解,判斷下你是不是真的會用,摸一摸你的基礎。二面的話就會刨根問底,對一個技術棧深挖你的瞭解程度以及一些架構設計。三面就比較水了,技術問題不多,判斷下你是否符合公司文化。

 

後續:拿到數據中臺部門的offer。

 

 

 

 

 

 

 

 

 

 

 

 

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