Offer經驗分享 – 螞蟻金服、位元組跳動、PDD、百度、華為、Paypal – Java社招面經
- 2020 年 12 月 19 日
- 筆記
年中的時候因為換工作的緣故,陸續參加了華為、螞蟻、位元組跳動、PDD、百度、Paypal的社招面試,除了位元組跳動流程較長,我主動結束面試以外,其他的都順利拿到了Offer。
最近時間稍微寬裕點了,寫個面經,希望對大家找工作有所幫助。
面試體驗
下面以時間先後順序,分享下我在不同公司面試的體驗。
華為
簡歷投遞方式:在BOSS直聘上聯繫的華為HR。
- 線上筆試:在正式面試之前,會有線上筆試環節,3道算法題,難易程度由淺入深,做出來兩道基本就沒問題了。
- 1輪面試:視頻面試,這輪面試會有兩個面試官,每個面試官大概會面試45分鐘,面試內容偏向Java基礎為主;最後會寫個算法題,不過也不複雜。
- 2輪面試:這輪主要是幾個領導一起電話面試,可能會問一些項目相關的內容,不過更多是框架相關的,不會涉及到很底層的技術細節。
- HR面試:溝通一下職級和薪資情況,華為的薪資是由基本工資和績效工資組成的,然後年終可能是2個月,我嘗試去argue了一下薪資,但是好像並沒有什麼卵用。
總結:華為面試官和HR都很Nice,整體面試難度中規中矩,都是偏重於基礎和簡單的算法,另外面試流程也很快,基本上兩周之內結束沒問題。不過現在華為社招基本是OD,也就是掛靠到外企德科那邊,不是正式員工,所以日後升職加薪可能會有所影響,這點大家需要自己考慮下。
螞蟻金服
簡歷投遞方式:朋友直接內推的,內推過後一周之內就聯繫面試了。
- 1輪面試:線上電話面試,杭州打來的,主要是介紹下項目,他會根據項目中的技術點,進行一些討論。印象比較深的是,當時我們討論下分佈式一致性的解決方案,但感覺他對我的回答不太滿意,哈哈。最後會發一個鏈接過來做題,題目主要考察Java多線程的使用,我當時的題目是在某種場景下找到最快的支付方式。
- 2輪面試:上海打來的電話面試,這輪是主管面試,也是項目為主,然後拓展開去很多基礎問題,比如分佈式鎖、分佈式一致性、事物、Java線程等等。這輪沒有做題,聊了大概一個小時,就結束了。
- 3輪面試:這次是2輪面試官的主管來面試,讓我直接去上海螞蟻Z空間面試。這輪的話,主要是講項目或者是說更宏觀一點的東西,沒有具體技術細節。
- HR面試:因為我面試的P6,所以3輪過後就直接HR面試了,HR側重阿里味的考察,比如樂觀、皮實等等。
總結:面試難度適中,流程基本上一周一面,整體下來一個月,當然不包括後續的背調、體檢之類的,因此如果要面試阿里,可以提前一些開始面試,然後一邊面試一邊復盤總結。
PDD
簡歷投遞方式:BOSS直聘找到pdd HR。
- 1輪面試:視頻面試。前半小時聊項目,後半小時做題。
- 2輪面試:視頻面試。前半小時聊項目,後半小時做題。
- 3輪面試:視頻面試。前半小時做題,後半小時聊項目。
- HR面試:確定薪資,因為PDD的強度非常大,大家可以大膽一點要薪資,不然進去以後後悔就晚了。
總結:PDD的面試流程非常簡單粗暴,就是做題加上聊項目,一半一半,題目難度基本是Leetcode上的Medium難度,我面試下來也沒有碰到很偏很怪的題目,面試準備的時候,把Leetcode上面常考的200題刷一刷就沒問題了。雖然最後沒有去PDD,但是PDD的面試官和HR都給我留下很好的印象,面試流程很舒服,就像和朋友交流一樣;PDD的流程很快,大概兩周之內出結果,因為不同公司的流程不一樣,HR那邊一直等了我好幾周,可以讓我拿到其他Offer了再回復她,這點上真的特別感激。
百度
簡歷投遞方式:BOSS直聘找到HR。
- 1輪面試:視頻面試。分享項目,然後問一些技術細節,主要偏向Java基礎、緩存、分佈式這塊。
- 2輪面試:視頻面試。這輪和上輪差不多,不過會問更多的技術細節,讓我在線寫了一個生產者消費者模式,還有一個算法題。
- 3輪面試:視頻面試。主管面試,比較輕鬆一些,聊聊工作、聊聊規劃就完了。
- HR面試:確定薪資,百度的薪資組成是Base加上股票。如果有其他公司的Offer,可以大膽argue一下,HR可能會有各種理由說不能加了,但是一定要堅持argue,我體驗下來,argue的空間還是很大的。
總結:面試側重於純技術,所以關於技術細節,一定要搞清楚弄明白;至於算法,百度考察的不深。面試流程很快,大概一周多就結束了。
Paypal
簡歷投遞方式:內推。
- 1輪面試:視頻面試,2個人輪流面試,時長2個小時。各種Java的細節,從包裝類、多線程到分佈式、緩存等等。每輪都需要做題,Medium難度。
- 2輪面試:視頻面試。3個人輪流面試,時長3小時,這個就看面試管的風格了,有的偏向於純算法,有的偏向於基礎。但是時長比較長,需要大家提前準備好。
- 兩輪面試之後,如果順利的話HR就會去申請Offer,很快就拿到Offer了。
總結:效率很高,面試官也很專業。薪資組成由Base加上股票組成,今年股價漲了不少,所以去年入職的同學賺了不少,哈哈。
位元組跳動
簡歷投遞方式:獵頭
- 1輪面試:基礎技術面試。不講項目,直接問基礎,包括操作系統、計算機網絡、Java基礎、數據庫、緩存、分佈式等等,問的面很廣。最後寫一道算法題。
- 2輪面試:項目和系統設計面試。側重於系統設計,比如設計朋友圈、12306系統等,後面也需要寫算法題。
- 3輪面試:可能第二輪沒有表現好,重新安排了面試官接着面試第二輪。這一輪也考察基礎和系統設計,順利通過了。
- 4輪面試:交叉面試,這輪面試體驗比較糟糕,面試官中途打電話、還處理了個線上的issue,哈哈。
由於當時已經有好幾個Offer,加上面試過程比較長,基本一周一面,所以也不想拖太久了。後面HR約最後一輪技術面的時候,我也直接拒絕了。
總結:位元組的面試是所有面試裏面難度最大的,因為基礎的考察面很廣,而且算法題不是那種常考的題目,有時候會碰到Hard難度,也都是看運氣了。如果要去面試位元組的話,算法一定要提前多準備,盡量多刷一些,以防到時連題目都沒見過,要你15分鐘內寫出來也就很難了。
經驗總結
多家面試總結下來,考察的範圍都很廣,包括基礎知識、項目和算法。
- 基礎知識這塊,需要花大量時間準備每一個細節,知其所以然,這樣才能面試的時候問起來,都能頭頭是道。比如Java的AQS原理,多線程,JVM內存等,框架的話,有Spring,MySQL、Redis、Kafka、ES、ZK等,都要十分熟悉。
- 項目,阿里比較注重項目,所以不僅要熟悉項目做了什麼事情,而且要提煉出項目中的閃光點或者說不一樣的地方,為什麼要選擇這種技術、架構怎麼設計、以後如何擴展、出問題了怎麼定位等等;這些在面試之前都要想清楚。
- 算法,這點沒的說,就是要多刷題。面試了這麼多公司,除了阿里,其他公司的每一輪都會要求做算法題,所以在面試之前要對各種常見算法瞭然於心,比如DFS、BFS、樹、貪心算法、常見DP等等,有時間的話多去刷刷題找感覺。
面試題分享
這部分分享一下我在面試準備過程中,以及面試時遇到的常考基礎題,大家可以針對題目複習一下。
1. Java基礎
1.1 Hashmap 與 concurrentHashMap (重點)
1.2 集合相關問題
1.3 Java 泛型的理解
1.4 跳錶(ConcurrentSkipListMap)的查詢過程是怎麼樣的,查詢和插入的時間複雜度?
1.5 java 位元組流 字符流
1.8 包裝類型和基本類型比較問題
1.9 為什麼重寫equals和hashcode
1.10 stringBuilder和stringBuffer的區別
1.11 Java序列化的原理
1.11 Java8、9、10、11的一些新特性介紹
1.12 java中四種修飾符的限制範圍。
1.13 Object類中的方法。
1.14 淺拷貝 深拷貝
1.15 接口和抽象類的區別,注意JDK8的接口可以有實現。
1.16 動態代理的兩種方式,以及區別。
1.16 傳值和傳引用的區別,Java是怎麼樣的,有沒有傳值引用。
1.17 一個ArrayList在循環過程中刪除,會不會出問題,為什麼。
1.18 Exception和Error區別
1.19 new關鍵字和newinstance()方法
1.20 Map、List、Set 分別說下你知道的線程安全類和線程不安全的類
1.21 Java防止SQL注入
1.22 反射原理及使用場景
1.23 static Vs Final ? 如何讓類不能被繼承
1.24 內存泄露?內存溢出?
1.25 重寫Vs重載
1.26 Lambda表達式實現
1.27 ClassNotFoundException和NoClassDefFoundError的區別
2. 並發、多線程
2.1 volatile 關鍵字 原理
2.2 對java中鎖的理解
2.3 悲觀鎖 樂觀鎖
2.4 對CAS的理解,java中的CAS,如何不用unsafe實現CAS
2.5 java 線程創建方式
線程run和start的區別?兩次start同一個線程會怎麼樣?
2.6 Java線程池的原理?線程池有哪些?線程池參數是什麼?
2.7 ThreadLocal及其應用場景
2.8 對線程安全的理解
2.9 get需要加鎖么,為什麼?
2.10 Lock的底層原理。synchronized、Lock、ReentrantLock、ReadWriteLock。
2.11 AtomicInteger怎麼實現原子修改的?
2.11 分佈式環境下,怎麼保證線程安全。
2.12 產生死鎖的四個必要條件?
2.13 如何中斷線程
2.14 線程的狀態都有哪些。
2.15 wait、notify、notifyAll、await、signal、sleep、yield
2.16 Callable和Future的了解。
2.17 synchronized關鍵字的用法,優缺點。
2.18 可重入鎖的用處及實現原理,寫時複製的過程,讀寫鎖,分段鎖
2.19 ABC三個線程如何保證順序執行。
2.20 雙線程交替打印奇偶 (阿里)
3. JVM
3.1 常見GC算法、 CMS收集器、G1
3.2 jvm內存模型 && Java內存模型
3.3 怎麼判斷對象可被回收?GC 可達性分析中哪些算是GC ROOT?
3.4 eden survivor區的比例,為什麼是這個比例,eden survivor的工作過程。
3.4 fullgc是否可以回收方法區
3.5 什麼對象會進老年代? 為什麼新生代使用複製算法?
3.6 被GC判斷為”垃圾”的對象一定會回收嗎
3.7 強制young gc會有什麼問題?
3.8 類加載的過程 Java為什麼要設計雙親委派模型?
3.9 什麼時候會觸發minor gc,什麼時候會觸發full gc?
3.10 G1和ZGC的區別
3.12 你知道強引用、弱引用和軟引用嗎? GC對他們執行怎樣的操作。
3.13 JVM方法棧的工作過程,方法棧和本地方法棧有什麼區別。
3.14 JVM的棧中引用如何和堆中的對象產生關聯。
3.15 逃逸分析技術。
3.16 Java是否可以GC直接內存。
3.17 常用的JVM調優參數。
3.6 具體的性能調優步驟嗎?fullgc的時候會導致接口的響應速度特別慢,該如何排查和解決。
3.18 dump文件的分析。
3.19 Java有沒有主動觸發GC的方式
3.20 假如現在在同一台機器上開兩個java項目,有幾個java虛擬機?
3.21 javac編譯期工作流程
4. Spring
4.1 spring IOC 過程
4.2 循環依賴怎麼解決的
4.3 spring AOP,動態代理是怎麼實現的
4.4 spring BeanDefinition作用
4.5 spring @Autowired (@Resource, 類似)實現原理
4.6 bean的生命周期
4.7 Bean的默認作用範圍是什麼?其他的作用範圍?
4.8 Spring的單例是怎麼實現的?
4.11 SpringMVC不同用戶登錄的信息怎麼保證線程安全的?
4.12 Spring用了哪些設計模式。
4.13 Spring注入bean的方式。
4.14 什麼是IOC,什麼是依賴注入。
4.15 Spring具有什麼特點(IOC和AOP)
4.16 幾種scope區別,aop實現有哪幾種實現,
4.17 spring的事務及實現模式
4.19 對Spring、SpringMVC、springBoot理解
4.20 @transactional註解在什麼情況下會失效,為什麼。
4.21 SpringMVC的Controller是如何將參數和前端傳來的數據一一對應的。
4.23 Spring如何維護它擁有的bean。
4.24 自定義註解的實現。
4.25 如何自己設計IOC框架
4.26 Quartz是如何完成定時任務的。
4.18 servlet的生命周期,怎麼判斷是get請求還是post請求,後台實現session共享的方法。Java web過濾器的生命周期?過濾器和攔截器的區別。
4.19 BeanFactory 和 FactoryBean 的區別
4.20 Spring中配置id或name相同的Bean可能引發的問題及解決方案
4.21 防止Web表單重複提交的方法
5. 消息中間件
5.1 kafka有哪些組件,kafka controller選舉過程,kafka leader重選舉過程
5.2 kafka 最早是為了解決什麼問題設計的
5.3 為什麼kafka用zookeeper來存儲metadata,而不是用db來存儲
5.4 kafka 只有一次生產 只有一次消費怎麼做
5.5 kafka的消費模式?kafka怎麼做有序消費?kafka 重消費解決?消息丟失怎麼解決?
5.6 Kafka的Replicas的作用?
6. 算法
6.1 B+樹
6.2 hash和B+樹的區別?分別應用於什麼場景?哪個比較好?
6.3 紅黑樹了解么,時間複雜度? 五個特性
6.4 堆排序的時間複雜度
6.5 快速排序,堆排序,插入排序
6.6 一致性Hash算法,一致性Hash算法的應用
限於篇幅,我沒有給出答案,感興趣的可以關注公眾號『後端精進之路』,發送『面經』獲取完整的答案, pdf有80頁左右。
本文由『後端精進之路』原創,首發於博客 //teckee.github.io/ , 轉載請註明出處
搜索『後端精進之路』關注公眾號,立刻獲取最新文章和價值2000元的BATJ精品面試課程。