這次面試的公司有一點點多,主要是因爲畢業後前兩份工作找的都很草率,這次換工作就想着,emm,畢業三年了,該找個工作好好沉澱幾年了。
先說下這次面試的結果吧:
到HR面的:阿里、美團、滴滴、金山雲、每日一淘、火幣、宜信、旺店通、黃包車、linkedMe
其他:
小米(四輪技術面,大概4個小時的樣子,大數據部門,不知道是不是四面的負責人嫌棄我木有大數據的經驗,我確實木有哈)
京東(電話面試一輪+現場兩輪,面試完快中午一點了,說是讓我先回家,後面讓HR 電話聯繫我,一週後一面的面試官問我還考慮京東不,如果考慮的話,就進行後續,對不起,我已經不考慮了,希望以後有機會再合作,所以沒有後續了)
頭條(二面完gg,我的算法確實菜哈,然後LeetCode又只刷過10道題,去面頭條,確實有些作死的節奏,實在是對不起幫我內推的石衝大佬)
愛奇藝(電話面試一輪+現場兩輪,到技術終面了,這個怪我,面試官也一直很忙,然後我倆就互相一直改面試時間,最後定的那個面試時間我還遲到了一個小時,還是時間到了纔給HR打電話說一個小時後才能到,雖然我知道這樣做非常不好,但是當時情況比較複雜,自己根本忙不過來,一直在面試,也沒有辦法中途給HR打電話說一下。
一天面兩家,兩家離的還比較遠的小夥伴吸取一下教訓。我本來是想約第二天下午的,HR就想當天,結果就晚上7:40開始二面了,面到9點,然後木有然後了)
有贊(電話面試一輪+現場兩輪,到技術終面了,面試官“base考慮杭州嗎”,我“啊,你們北京不是也需要人嗎,最好北京哈,杭州暫時不考慮”,然後木有然後了,哈哈。
後面面阿里的時候我就自己打臉了,面試官“base杭州考慮嗎”,我“面過阿里我就去杭州,面不過我就在北京”。愛,就要大膽的說出來。)
這次面試基本都是三~四輪技術面,很多都是每一輪都有至少一道算法題,所以準備換工作的小夥伴,算法可以搞起來了哈,LeetCode easy和medium 難度的就ok了,當然如果你也要刷hard 難度的題,是更好的哈。
我作爲一名只刷過10道LeetCode 的渣渣,表示以後要好好刷LeetCode 了,拯救一下自己的智商。準備面頭條的小夥伴,那就medium 和 hard難度的搞起來吧。你們加油,我就不想了。
羣裏有很多小夥伴懷疑我是985、211或者研究生畢業,都不是的哈,渣本(但是我還是很愛我的母校的),16年畢業,我一個妹子都可以做到的,你們更可以做到,所以相信自己,去努力就好了。
這篇文章主要是記錄一下自己的面試經歷,分享一些羣裏小夥伴們都很關注的面試題,我個人感覺不錯的,可以提升技術的,當然面試中也會對你有特別大的幫助。
阿里的面試題不會分享哈,這次主要分享TMDJ、以及其他公司的一些面試題,把我分享的這些面試題都掌握了,對想去面阿里的小夥伴的幫助也是非常非常大的。當然,面試題只是起一個查漏補缺的作用,並不是讓你直接去整理答案,去背答案的哈。
一個合格的面試官,是會針對你的簡歷去問的,即每個人的面試題都是不一樣的。
頭條
二輪技術面,17:00~20:25,晚飯時間HR小姐姐還特貼心的帶我體驗了一把傳說中的頭條餐廳,不超過半小時:
聊項目,畫項目架構圖,畫一個用戶從發起請求到接收到響應,中間經過哪些服務,每個服務做什麼事情的流程圖。
講項目中的難點、挑戰,你是如何解決的?
Redis 中有幾種類型 & 各自底層怎麼實現的 & 項目中哪個地方用了什麼類型,怎麼使用的?
Redis如何實現分佈式鎖,zk如何實現分佈式鎖,兩者的區別。如果service還沒執行完,分佈式鎖在Redis中已經過期了,怎麼解決這種問題?
synchronized底層實現,加在方法上和加在同步代碼塊中編譯後的區別、類鎖、對象鎖。
鎖升級的過程。
Java運行時區域及各個區域的作用、對GC的瞭解、Java內存模型及爲什麼要這麼設計?
對索引的理解,組合索引,索引的最佳實踐
countDownLatch用過沒有,在項目中如何使用的,對AQS的瞭解。
寫生產者消費者問題,考慮高併發的情況,可以使用Java 類庫,白紙寫代碼。
如下圖所示:
設計一個發號器,考慮集羣和高併發的情況,要求發號器生成的id是遞增趨勢,通過id可以區分出來是今天生成的id還是昨天生成的id,但是生成的id中不能直接帶有日期,要具有一定的混淆功能,白紙寫代碼
一個二位數組,每個元素都可以往上下左右四個方向走,尋找最長遞增路徑。如下圖所示,最長遞增路徑即紅色字體路徑。白紙寫代碼。
美團
電話面試(40分鐘)+現場三輪技術面試(3.5小時)+HRBP面試(30分鐘)
數據庫和緩存的一致性問題。先更新數據庫,再更新緩存,若更新完數據庫了,還沒有更新緩存,此時有請求過來了,訪問到了緩存中的數據,怎麼辦?
聚簇索引/非聚簇索引,MySQL索引底層實現,爲什麼不用B-Tree,爲什麼不用hash,葉子結點存放的是數據還是指向數據的內存地址,使用索引需要注意的幾個地方?
MySQL默認的事務隔離級別,MVCC、RR怎麼實現的?RC如何實現的?
MySQL間隙鎖有沒有了解,死鎖有沒有了解,寫一段會造成死鎖的SQL語句,死鎖發生瞭如何解決,MySQL有沒有提供什麼機制去解決死鎖
談下對GC的瞭解,何爲垃圾,有哪些GC算法,有哪些垃圾回收器,cms和g1的區別,還有一個直擊靈魂的問題,看過cms的源碼嗎?
有沒有排查過線上OOM的問題,如何排查的?
有沒有使用過JVM自帶的工具,如何使用的?
假設有下圖所示的一個Full GC 的圖,縱向是內存使用情況,橫向是時間,你如何排查這個Full GC 的問題,怎麼去解決你說出來的這些問題?
說說對Java中集合類的理解,項目中用過哪些,哪個地方用的,如何使用的?
對CAS的理解,CAS帶來的問題,如何解決這些問題?
volatile底層、synchronized底層、鎖升級的過程、MESI
Ehcache支持哪些緩存?
JUC有研究沒有,講一講?
聊項目,畫項目架構圖,畫一個用戶從發起請求到接收到響應,中間經過哪些服務,每個服務做什麼事情的流程圖。
講項目中的難點、挑戰,如何解決的,項目這一塊會問的特別細。
如何保證RocketMQ 消息的順序性,如何解決重複消費問題。
項目中如何保證接口的冪等操作。
講一講對Redis 的瞭解,項目中如何使用的,哪個地方使用的,爲什麼要使用?
哨兵機制、Redis 兩種備份方式的區別,項目中用的哪種,爲什麼?
講一講對分佈式鎖的瞭解
項目中系統監控怎麼做的?
如何理解Spring中的AOP 和 IOC,以及DI,讀過Spring源碼沒有?
讀過MyBatis源碼沒有?
說一個你瞭解最多的框架,說出你的理解。
如何理解分佈式事務,爲什麼會出現這個問題,如何去解決,瞭解哪些分佈式事務中間件?
聊一聊對分庫分表的理解。
Hystrix功能和在項目中怎麼使用的?Hystrix怎麼檢測斷路器是否要開啓/關閉?Hystrix實現原理?除Hystrix之外的其他熔斷限流中間件有了解沒有,瞭解多少說多少?
Dubbo有了解沒有?
怎麼理解Java 中和 MySQL中的樂觀鎖、悲觀鎖?
一致性hash
滴滴
現場三輪技術面試+一輪HRBP面(4小時5分鐘)
1.聊項目,畫項目架構圖,畫一個用戶從發起請求到接收到響應,中間經過哪些服務,每個服務做什麼事情的流程圖,講數據庫設計。
2.處理過線上OOM問題沒有,如何處理的?
3.遇到過線上服務器CPU飆高的情況沒有,如何處理的?
4.線上有沒有遇到其他問題,如何處理的?
5.對線程池的理解,項目中哪個地方使用了,如何使用的,用的Excutor框架中的哪個實現類,爲什麼用這個
6.對CAS的理解,CAS帶來的問題,如何解決這些問題?
7.volatile底層、synchronized底層、鎖升級的過程、MESI
8.對MySQL索引的理解、對組合索引的理解、索引的最佳實踐
9.分佈式鎖的實現、對比Redis分佈式鎖 & ZK分佈式鎖
10.唯一ID如何實現的,Snowflake實現原理,Snowflake有哪些問題,如何避免根據訂單號可以推算出今天的訂單量
11.如果線上一個功能是用棧結構實現的,使用過程中要注意哪些問題,爲什麼?
12.怎麼理解線程安全?
13.怎麼理解接口冪等?項目中如何保證的接口冪等?
14.怎麼理解微服務,服務如何劃分,可以從哪幾個方面去劃分,爲什麼這樣劃分,微服務帶來了哪些好處,哪些壞處,如何看待這個問題?
15.如何理解網關,網關帶來的好處和壞處,如何解決
16.Hystrix功能 & 在項目中怎麼使用的 & Hystrix怎麼檢測斷路器是否要開啓/關閉 &Hystrix實現原理
17.怎麼理解命令模式和觀察者模式,手寫一個觀察者模式或者命令模式的代碼,策略模式也行
18.掌握哪些設計模式,常用哪些,項目中如何使用的,爲什麼用這個,不用那個?手寫一個線程安全的單例模式
19.如何設計一個秒殺系統?
20.如果我現在就是要實現每秒10w請求,不能熔斷限流,如何去設計?
21.假設現在雙十一零點,大量下單請求,如何對這些訂單進行分庫分表,爲什麼?
22.服務A調用服務B中一個接口,服務B調用服務C中一個接口,如何實現若服務B響應服務A成功,則服務C一定響應服務B成功,需要考慮系統性能問題?
23.遞歸使用中有什麼需要注意的地方,遞歸寫法一般可以用什麼去替換?
24.有兩個表,table a,table b,寫SQL查詢出僅在table a中的數據、僅在table b中的數據、既在table a 又在table b 中的數據?
25.Spring 源碼有了解沒有?
26.MyBatis源碼有了解沒有?
27.MySQL事務隔離級別、MVCC?
我:既然現在很多業務線都是Go了,有沒有考慮把剩餘的業務線也轉成Go呀?
面試官:我認爲,語言只是工具,語言不應該是影響開發的一個因素吧。
面試官說的很有道理。
京東
電話面試(30分鐘)+現場兩輪技術面試(1小時40分鐘),面完12:50,說讓我先回來,後續hr 電話和我聯繫,一週後一面的面試官問我還考慮京東嗎,對不起,已經不考慮了,希望以後有機會再合作
一個final修飾的屬性,定義的時候沒有初始化,在無參構造函數中初始化,可以嗎,爲什麼
說說對Java中集合類的理解,項目中用過哪些,哪個地方用的,如何使用的,爲什麼不用其他的集合類
HashMap,concurrentHashMap底層實現
List刪除是怎麼實現的,遍歷的時候可以刪除嗎?爲什麼?
Redis中有哪些數據結構,瞭解過其底層怎麼實現的嗎,和Java中相似的數據結構的對比?
Redis是單線程的還是多線程的,爲什麼這麼快?
Redis Hash中某個key過大,變爲String類型的大key,怎麼處理,使用中如何避免出現這種問題?
設計模式在項目中哪個地方用到了,怎麼使用的,能不能畫一個你熟悉的設計模式的UML圖,手寫單例模式,手寫靜態內部類實現的單例模式。
講一講MySQL索引,實際工作中,哪些場景用了B+Tree索引,哪些場景用了hash索引?
explain 可以看到哪些信息,什麼信息說明什麼,explain的結果列講一下
Spring源碼看過沒有,會多少講多少?
MyBatis源碼看過沒有,會多少講多少?
CAS的缺點,如何解決?
AQS、countDownLatch如何實現?
線程池如何實現,核心線程數和最大線程數設置成多少,爲什麼這麼設置,項目中哪個地方使用了線程池,使用時需要注意什麼
MySQL事務隔離級別,幻讀,髒讀,項目中用什麼事務隔離級別,爲什麼?
volatile底層原理、synchronized實現機制
對XA、TCC的理解,瞭解哪些分佈式事務框架,有什麼缺點?
Feign 和 Dubbo,瞭解多少說多少?
Eureka 和 Zookeeper,瞭解多少說多少?
Hystrix 和 sentinel,瞭解多少說多少?
Spring Cloud Alibaba,瞭解多少說多少?
對分庫分表、讀寫分離的瞭解,瞭解多少說多少?
畫一下Java 線程幾個狀態及狀態之間互相轉換的圖?
聊項目,畫項目架構圖,畫一個用戶從發起請求到接收到響應,中間經過哪些服務,每個服務做什麼事情的流程圖,講數據庫設計具體到部分表中有哪些字段?
部門體量比較大,可能需要加班,到凌晨兩三點的那種,也可能通宵,通宵是大促期間,你能接受嗎?
也會加班到十點,這個不是大促期間,但也不是每天,非常態情況,你能接受嗎,你在哪裏住,過來要多久,有男朋友嗎?
下面是面試TMDJ之外的公司中遇到的一些問題哈,TMDJ中已經被問到的就不再重複寫了,只寫一下個別公司中我還記得的面試題。
其他面試題
火幣:
四輪技術面試+一輪HR面試(4小時),後來HR小姐姐和我說,她們正常是兩輪技術面試,因爲技術面試完面試官一直沒有找到她,然後就又來了一輪技術面試,又來了一輪技術面試。
Kafka 如何保證消息順序消費、在consumer group 中新增一個consumer 會提高消費消息的速度嗎、那如果我想提高消息消費的速度,我要怎麼辦?
Redis幾種數據結構及底層,項目中如何使用的Redis?
哨兵機制、選舉算法
一致性hash
Redis是單線程的還是多線程的,爲什麼速度這麼快?
多路複用的幾種方式以及區別?
對線程池的理解,在項目中如何使用的,多個線程之間如何共享數據,多個進程之間如何共享數據?
HashMap、concurrentHashMap的區別及底層實現、HashMap和HashTable 的區別?
什麼是紅黑樹,什麼是B-Tree,爲什麼HashMap中用紅黑樹不用其他樹?
對MySQL索引的理解,爲什麼MySQL索引中用B+Tree,不用B-Tree 或者其他樹,爲什麼不用hash 索引?
數據庫和緩存的雙寫一致性問題?
每日一淘:
三輪技術面試+一輪HRBP面
用過哪些Object類的方法,如何使用的
Java如何實現序列化的,Serialization底層如何實現的
countDownLatch如何實現的
項目中監控報警機制如何做的,說說你的瞭解
線上服務器CPU飆高,如何處理這個問題
服務A調用服務B,用戶請求服務A,發現返回較慢,如何定位這個問題
TIME_WAIT是什麼狀態還記得嗎,什麼情況下網絡會出現這個狀態
linkedMe:
二輪技術面試+一輪HR面試
內核態和用戶態、cas 和 sout 哪個用到了內核態和用戶態的切換
哪些典型的應用用的是UDP?
線程池有了解嗎,項目中如何使用的?
計算密集型/IO密集型任務分別如何設置線程池的核心線程數和最大線程數,爲什麼這麼設置?
假如我下午5點要和5個人一起開會,但是這5個人現在都出去了,不在公司,但是今天會回來,問,我如何開這場會,用Java 併發方面的知識回答。
旺店通:
5小時+,中午我還木有喫飯,下午面試時候真是餓的要死,而且下午腦細胞死了好多好多
先機試(50分鐘時間,三選二,不聯網,明確告知機試不通過沒有後續)
一面給面試官講一下自己機試題的思路,面試官運行看結果,然後問了幾個問題(什麼是B-tree,什麼是B+tree之類的)
筆試(10道選擇題+2道數據庫+2道算法題,30分鐘)
二面給面試官講自己的機試題的思路,面試官運行看結果,然後給面試官講筆試題,一道一道講爲什麼這麼寫,過程中面試官可能會改題,然後問你怎麼解決修改後的題,然後又問了幾個題
三面開始正常面試,但不是看簡歷問,一部分是簡歷上的,一部分是看面試官心情
HR面
當場給了Offer,但是啊,從他家出來的時候的想法就是,早知道下午這個樣子,不如中午喫個午飯,回家好好睡一覺。
想去他家的小夥伴就好好寫代碼吧,多看Java 中一些方法的實現,因爲機試的題目都要求不能用Java中提供的方法,要自己寫,然後還要好好準備算法。
算法題
[1,1,2,2,3,4,4,5,5,5] 找出不重複的元素(黃包車)
反轉鏈表,要求時間複雜度O(N),空間複雜度O(1) (火幣)
非遞歸實現斐波那契數列 (愛奇藝)
這一週股市價格爲[2,6,1,4,8],求哪一天買入哪一天賣出,可獲得最大收益,最大收益爲多少 (愛奇藝)
按照箭頭方向查找二叉樹 (金山雲)
表a b c之間用ID關聯,求陰影部分的數據 (金山雲)
一個整形無序數組,裏面三個數只和等於一個目標值,求這三個數 (小米)
鏈表問題 (小米)
撲克牌問題 (小米)
有十張撲克牌,從上面開始抽,抽出一張放桌子上,然後再抽出一張放撲克牌的最下面,這樣循環往復的操作,直到手裏的牌都沒有了。這時,桌子上牌的順序正好是1 2 3 4 5 6 7 8 9 10。要求寫代碼求出原順序
手寫大頂堆 (linkedMe)
手寫LRU 算法 (火幣)
字符串相加 (滴滴)
兩個數字類型的字符串,直接轉int或者double肯定都放不下,然後求這兩個數的和,返回值還是字符串,15分鐘時間,要求無Bug
尋找目標值位置 (滴滴)
有一個二維數組,數組橫向有序,縱向有序,求目標值的位置,10分鐘時間
求字符串“efabcbaefehiabcba”中最長的迴文數,不去重(美團)
反轉int類型的值x,不要借用String,只用int 即可。&& 針對該程序,寫出其應有的測試用例 (美團)
top K 問題(每日一淘)
HR面
真誠待人,以真心換真心,不要弄虛作假,HR 問什麼問題,如實回答即可。在回拒Offer 時候,也請好好說話。
Tips:
其實面試過程中,你是可以感受到哪些面試官是真的很欣賞你,哪些只是想找一個可以幹活的人的,最後一定要去一個欣賞你的面試官那裏,因爲待遇真的會不一樣(假裝我體驗過只是想找我幹活的Leader哈,很感激以前遇到的每一位Leader 都很欣賞我,給我我想要的空間去做自己想做的事情,真的非常感謝你們)。
作者簡介:Bella,16 年本科畢業,94 年程序媛一枚,現就職於阿里,從事Java開發。