澳洲留學生面經,Java後端,阿里、頭條、百度、華爲、微策略
作者:奧迷介;
來源:牛客網;
鏈接:https://www.nowcoder.com/discuss/144550
本人情況:澳洲Top2本,科班出身,Java後端開發,無大廠實習經歷,今年年底畢業。
在剛結束的秋招中有幸參加了幾家國內大廠的面試,一路被虐過來的同時也能見到自己的成長。在準備秋招的時候從牛客前輩們的帖子裏收穫良多,故發一篇面經回饋社區,也給自己做一個總結。
技術面試都在45分鐘到2小時不等,有的面試時間有點久遠,所以可能會記漏問題或者記串公司。問題後的括號裏是我的理解,有不對的地方歡迎指正。
筆試部分就不總結了 無非是選擇題,場景題加在線編程題,在牛客刷過題的朋友應該都沒問題。
阿里-Java研發工程師:
提前批一面(螞蟻金服,電話面):
先過了一遍簡歷上的項目,根據項目提了一些問題
- Servlet和Jsp的本質?它們有什麼區別(後者是前者的高一級封裝,都編譯成獨立的.class字節碼)
- Servlet創建的過程
- Servlet中的變量是否需要加鎖(單實例多線程)
- 用戶數據有沒有加密,用了什麼加密方法
- 服務器是否是分佈式
- 數據庫是否是分佈式,總共有幾張表
接着是基礎:
- 講講HashMap的底層實現原理,get的過程發生了什麼(hashCode和equals方法)
- 講講對數據庫事務的理解(ACID,隔離級別)
- 講講悲觀鎖和樂觀鎖
最後是共享屏幕編程:
- 輸入一個長字符串,打印出其中出現的每個詞及其出現次數。(我說用字典樹,面試官說只能用Java自帶類庫。最後用正則表達式加HashMap寫出)
- 分析一下算法複雜度
- 能來實習嗎
提問環節
二面(電話面):
- 大學期間有哪些印象深刻的計算機課程?(函數式編程,面向對象,算法與數據結構,關係型數據庫,分佈式與併發,計算機組成與程序運行原理,操作系統,編譯原理)
然後面試官提出相關的問題:
- 什麼是函數式編程,和Java的面向對象思想有什麼區別
- 講講你對Haskell這門語言的理解(函數的柯里化,無副作用,惰性求值)
- 爲什麼Haskell很少用於工業開發(無副作用的按值傳遞帶來效率問題,開發者社區的商業資金注入不足,學習成本較高)
- 按值傳遞和按引用傳遞的區別?
- 方法A調用方法B的過程中方法棧上發生了什麼(棧幀的創建與銷燬)
- 棧幀中包含哪些內容?
- 講講HashTable和HashMap的區別(hash定位方式,線程安全性)
- 你會怎麼實現樂觀鎖和悲觀鎖
- 講講對Volatile的理解(禁止指令重排,通過無效化緩存行保證多線程可見性)
- 對緩存行了解多少,僞共享知道嗎(MESI緩存一致性協議,JDK8的Contended註解)
- 平時Linux用得多不,常用的命令?
- Linux系統運行緩慢的時候你會怎麼做
- 操作系統Mount一個設備的時候是在做什麼(給當前文件系統提供一個訪問設備數據的入口)
- 命令行裏按Ctrl-C發生了什麼(父進程向子進程發送終止信號)
- 信號和中斷的區別(前者可以在用戶空間內定義子流程,且爲有時延的異步執行過程,後者需要根據系統中斷向量表查找相應子流程或由設備驅動提供子流程,且涉及內核態和用戶態的切換)
- 什麼是文件系統
- 文件系統是怎麼組織的
- 你有什麼問題想問我的嗎
專場初面(阿里媽媽,視頻面):
- 先做個自我介紹吧
- 詳細講講簡歷上的每個項目,用到什麼技術,從中獲得什麼收穫
- 給一長串數字,其中每個數字的出現次數相當,且其中大部分爲1到3000的小數字,少部分爲上界不確定的大數字,針對這串數字設計一個2進制無損壓縮算法。(闡述思路的時候提到了哈夫曼編碼)
- 講講哈夫曼編碼的思想和建樹過程?
- 哈夫曼編碼方式在這個場景中是否適用,爲什麼(不適用,元素數量多且各元素頻數差距小的情況下哈夫曼效率低下)
- Java的Object類中有哪些方法,各自的用途
- 講講對面向對象的三大特性的理解
- Java中有哪些訪問控制符,各自的範圍(public > protected > default > private)
- 講講熟悉的垃圾回收器(G1)
- 講講Spring的AOP和IOC
- 對http協議的理解(基於TCP協議,C/S模型,對URI的操作)
- 講講TCP的三次握手過程,爲什麼一定要三次
- 知道哪些http請求方式,用過哪些(GET, POST, PUT, UPDATE, DELETE)
- GET和POST的區別(消息體,用途,URL,書籤,傳輸格式,長度限制)
- 講講http長連接(http1.0的connection: keep-alive, http1.1的默認方式,通過心跳包保活)
- http和https的區別(後者要先通過SSL層的非對稱握手過程獲得協定的對稱密鑰,用於後續會話的加/解密)
- MySQL數據庫引擎有了解嗎
- 講講數據庫的4個隔離級別(讀取未提交,讀取已提交,可重複讀,串行化)
- 數據庫索引用了什麼數據結構(B加樹)
- B加樹的實現原理,和B樹的區別
- 組合索引瞭解嗎
- 使用組合索引時有什麼需要注意的(最左匹配)
- 給出下列常用的SQL語句,如何建立索引?如果我現在在這個字段上建立了索引,那執行這個SQL語句時會不會用到這個索引?(需要注意最左匹配,模糊查詢,or查詢,中間提到了SQL語句執行前的預優化階段)
- 手撕代碼:N個數中取最大的10個數,N > 10000。(維護一個元素數爲10的小根堆,把所有數據過一遍)
- 分析一下這個算法的複雜度(O(n) 時間, O(1) 空間)
- 加個微信?
- 你有什麼想問的嗎
終面(電話面)
聊天,個人經歷相關:
- 簡單地介紹一下自己
- 有女朋友嗎
- 留學幾年的收穫
- 課餘時間喜歡做些什麼
- 在學校做過什麼學生工作
- 在學校成績怎麼樣
- 對自己的職業規劃是怎樣的
技術問題:
- 講講網絡分層,每一層都有哪些協議(TCP/IP五層模型)
- 瀏覽器從輸入URL到頁面顯示的過程中發生了什麼,越詳細越好(解析URL,解析DNS(緩存未命中的情況下需要從根域名開始遞歸查詢),建立TCP連接,http請求與答覆,Render樹的建立,頁面的渲染)
- 講講http報文的格式?請求和答覆有什麼不同
- 自己抓包看過沒(Wireshark)
- 現在有1T的文本數據,每行表示一個關鍵詞,求出現次數最高的10個關鍵詞,限定單機只有4G內存。(先假定內存足夠,則用HashMap加小根堆可解, 再解決內存的問題:先用hash方法把1T的文本文件散列成多個足以讀入內存的小文本文件,分別對每個文件做統計,最後對每個文件的統計結果做總統計)
- 你覺得你的方案有什麼不足嗎(數據分佈可能不均勻,可對文本數據採用多次hash,直至單個數據樣本足夠小)
- 現在有一個包含上億條目的表,現實中會有大量的用戶在這個表上做基於uuid的查詢操作,如何改良這個系統的可用性(對這張表的uuid用哈希法做水平切分並建立索引,然後在用戶查詢時用同樣的哈希算法導向到相應的表)
- 你說的是數據庫層面的優化,對別的層面有什麼想法嗎,比如用戶查詢存在高峯期,如何在節約服務器資源的前提下保證對高併發的容忍度。(在服務器端建立令牌池,每隔固定時間向其中發放令牌,令牌總數有限。每個查詢在執行前必須先獲取令牌。令牌總數即爲某個時刻下服務器可承載的最大併發數,令牌發放間隔即爲最大用戶增速)
接着聊天,國內互聯網行業發展相關
總結:面試體驗好,面試官親切,問問題時會做一些引導和提示,也會告訴你哪些方面存在不足,總體比較注重基礎知識,尤其是對Java語言本身的理解。手寫代碼的題比較簡單,應該是想考察編碼規範程度。面試官水平高,什麼都能聊。但電話面試不會預約,你也不知道什麼時候會突然來電話(一面和二面的時候我就在睡覺,時差黨)。專場初面面試官是個清秀的小姐姐。
字節跳動-服務器端開發工程師:
內推一面(西瓜視頻,視頻面):
- 自我介紹
- 介紹一下項目用到的技術
- 對http有哪些瞭解(0.9到2.0各版本區別,C/S模型,TCP)
- https是怎麼做到會話加密的(SSL握手確立會話密鑰)
- 講講你知道的非對稱加密算法(基於離散對數難題的DH算法和基於質因數分解難題的RSA算法)
- Cookies和Session有什麼區別
- 如果用戶禁用了Cookies,如何獲取用戶的狀態
- 講講http狀態碼(2正常,3重定向,4客戶端錯誤,5服務器端錯誤)
- 301和302分別是什麼情況
- TCP和UDP的區別
- TCP是怎麼做擁塞控制的(滑動窗口,慢啓動算法)
- 詳細講講TCP三次握手和四次揮手的過程,中間涉及哪些狀態位的變化
- 爲什麼分別要三次和四次
- 四次揮手時爲什麼需要等待2倍最長報文發送時間
- 迅雷爲什麼用UDP傳輸文件(P2P環境中的NAT穿孔問題)
- 進程和線程的區別
- 創立和銷燬進程的開銷具體指什麼
- 對比多進程和多線程的優劣
- 進程間有哪些通信方式,分別的使用場合
- 解釋一下殭屍進程和孤兒進程
- 講講Linux的內存管理方式
- 講講你知道的進程調度算法
- 你會怎麼實現JVM(這個問題直接把我卡死了)
- 那你介紹一下現有的JVM內存模型(先講5大區域,再補充說明JDK7方法區和永久代的分離,JDK8的元空間)
- 講講你瞭解的垃圾回收算法(G1,CMS)
- 回收過程中的哪個階段需要stop the world
- 爲什麼CMS回收器不常用
- 你覺得現有的垃圾回收器有哪些地方需要優化,讓你來優化你會怎麼做(G1需要較多額外空間開銷(Remember Set, Collection Set),回收進行中也對剩餘空間有要求,CMS的重新標記階段停頓時間較長且時間不可控)
- 講講Java類加載器的雙親委派機制
手撕算法:
- 輸入一個二維數組,從(0,0)開始順時針由外向內旋轉打印出每個元素。
- 分析你的算法複雜度。
二面(視頻面):
- 自我介紹
- 在學校學了哪些計算機課程
- 關係型數據庫和併發分佈式,你挑一個熟悉的,我來問(挑了併發分佈式)
- Paxos協議和Raft協議瞭解嗎(Raft的半數選舉,定時心跳保活/重選舉,基於日誌保證一致性,小於半數的分區容錯性)
- P2P環境下的分佈式緩存問題(一致性Hash)
- 有沒有JVM調優的經驗,看過dump沒(gg)
- 講講對Redis的瞭解,有哪些基本類型和各自底層實現方法
- 什麼是死鎖(四個必要條件)
- 死鎖的預防和避免方法(銀行家算法,打破必要條件)
因爲簡歷上提到自學過FPGA,也被問了幾個問題:
- FPGA編程用到了什麼語言(verilog)
- FPGA和普通單片機有什麼區別(前者通過對數字電路邏輯單元的組合實現基於硬件的並行運算,無需共享內存,但燒寫程序的時間很長,後者基於傳統的馮諾伊曼架構)
手撕算法:
- 輸入兩個有序數組,求兩個數組中所有數字的中位數,要求時間複雜度爲O(log(m n)),m和n爲兩個數組的長度。
總結:一面可能是碰到了壓力面試或面試官心情不好,會打斷人說話,且眼睛盯着另一塊屏幕。二面面試官態度有好轉。面試總體更注重操作系統和計算機網絡基礎知識,以及算法和工業實戰經驗。面試採用牛客面試平臺,個人體驗不佳,畫面和聲音延遲問題較嚴重,兩輪面試總共掉線4次,對心態有較大影響。
華爲-IT應用軟件開發工程師:
技術面(視頻面):
- 自我介紹
詳細地過了一遍簡歷上的項目
- 談談項目過程中的個人收穫
- 項目過程中碰到哪些難題,怎麼解決的
- 講講對面向對象思想的理解(封裝、繼承和多態)
- 講講對REST的理解
(別的問題不記得了)
- 你爲什麼喜歡Java(用Python和C艹分別做了比較。介紹了JVM的實現,垃圾回收算法的發展,自帶類庫的實現blabla。這個問題和面試官聊了蠻久)。
- (面試官看錶)你是今天最後一個面試者,不如把這次面試當作一個開放的對話,講講你的職業規劃吧(…說好的技術面呢)
- 希望以後有機會交流技術
- 有什麼想問我的嗎
綜合面(視頻面):
- 自我介紹
又過了一遍簡歷上的項目,並挑了其中規模最大的項目
- 這個項目有多少人
- 項目中你貢獻了多少代碼
- 平時怎麼跟客戶溝通(定期Slack在線會議和線下會議)
- 項目是用敏捷開發嗎
- 項目初期應該做哪些準備(User Story和 Use Case的確立,各個sprint的階段目標,確立最小可用產品,以及任務優先級決策)
- 在校成績如何
- 平時是怎麼學習的(CSDN,StackOverFlow,Youtube,微信學習小組)
- 你的朋友們是怎麼看你的
- 當初爲什麼選擇出國
- 你對華爲的企業文化有什麼瞭解和看法
- 期待的工作地點和薪資
- 你有什麼想問我的嗎
總結:見識到了華爲傳說中的玄學聊天面試,總體體驗良好,氣氛比較輕鬆,更注重考察面試者某方面的專精程度和對項目管理的理解,以及可培養性。是唯一一家除了筆試的編程題外不用現場手撕代碼的(不過我有朋友被要求現場手寫代碼,應該是看面試官)。面試過程採用Zoom視頻會議軟件,海外用戶體驗好。整個招聘流程安排得井井有條,從最早的電話聯繫到每次面試專用的微信羣建立,可以說是感動留學生。
百度-Java研發工程師:
一面(視頻面):
- 自我介紹
- 項目介紹,用到的技術和碰到的難點
- Java的Object類中有哪些方法,各自的作用
- HashMap是線程安全的嗎(多線程擴容的鏈表死環)
- 講講HashTable和HashMap的區別
- 爲什麼HashTable不允許null鍵值(HashTable起初是爲併發環境設計。如果get一個null鍵返回的結果是null,那麼有兩種可能: 1.hashtable中存放了一個(null, null)鍵值對。 2.hashtable中不存在null這個key。 這就要求使用者用containsKey()方法來做進一步確認。但是在這兩個操作中間很可能發生併發修改導致結果出錯。所以一開始就禁止了null鍵或null值。相同的理念也可以在其他的併發map中見到。)
- ConcurrentHashMap是怎麼確保線程安全的(JDK7的分段加鎖,JDK8的行鎖)
- 什麼時候會出現Fail-Fast機制(遍歷併發集合時ModCount發生變化)
- ArrayList是線程安全的嗎(對下標的競爭,擴容的競爭)
- 多線程下用什麼動態數組(讀多寫少CopyOnWriteArrayList,Vector)
- 講講Synchronized和ReentrantLock的區別(順便提了對象監視器, JDK5之後引入的偏向鎖->輕量級鎖->重量級鎖以及他們在對象頭中的表示,還有CAS和AQS)
- 講講對CAS和AQS的理解(AQS基於CAS,基於AQS可以實現用途不同的同步器,基於不同的同步器可以實現用途不同的同步類,如Semaphore, CountdownLatch, ReentrantLock,基於不同的同步類可以實現不同的併發類)
- CAS的ABA問題
- 線程池的各個參數作用
- 線程池的丟棄策略
- LinkedBlockingQueue和ArrayBlockingQueue的區別(前者基於無界鏈表且take和put分別加鎖,後者基於有界數組,take和put用同一個鎖)
- 講講MySQL數據庫引擎
- 講講事務的四個隔離級別
- 事務隔離級別是怎麼實現的(基於共享鎖與排他鎖。讀取未提交:讀不加鎖,寫加行級排他鎖直至事務結束。讀取已提交:讀加行級共享鎖直到讀取結束,寫加行級排他鎖直到事務結束。可重複讀:讀加行級共享鎖直到事務結束,寫加行級排他鎖直到事務結束。串行化:讀加表級共享鎖直到事務結束,寫加表級排他鎖直到事務結束)
(別的問題不記得了)
- 手撕代碼:求兩個字符串的最長公共子串(動態規劃)
- 除了後端方向之外你平時還對什麼方向感興趣(自學過斯坦福機器學習公開課)
- 有什麼想問的嗎
二面(視頻面):
- 自我介紹
- 假設有一個商城應用,如何保證併發的多個相同退款請求只被處理一次(全局唯一請求ID)
- 怎麼實現郵件黑名單功能(布隆過濾器 白名單機制)
- 怎麼實現單點登錄(子服務的登錄請求全部路由至主服務,初次登錄時在主服務端保存全局會話令牌,後續子服務的局部會話需請求和驗證該令牌,退出登錄時將該令牌無效化)
手撕代碼:
- 用Object類的wait和nofity方法實現一個生產者消費者模型
- 已知平面中兩個噴泉的座標和N個花壇的座標,求兩個噴泉的半徑r1和r2,使得噴泉能澆灌到所有花壇,且r1^2加r2^2的值最小。(維護兩個大小爲N的大根堆A和B,堆A的排序標準爲花壇到噴泉1的距離,堆B的排序標準爲花壇到噴泉2的距離。先把所有花壇加入堆A,再依次從堆A中將堆頂元素出堆並加入堆B,同時記錄下堆A堆頂元素與堆B堆頂元素的平方和S。當堆A爲空時,輸出整個過程中S取到的最小值,即爲答案,時間複雜度O(nlogn),空間複雜度O(n))
總結:面試體驗良好,面試官親切,注重基礎和對工業場景的瞭解。但是二面寫算法題時我因爲牛客面試平臺網絡不穩定而被迫下線,且無法聯繫百度招聘方,事後百度一直沒消息,官網狀態至今仍然是"面試流程中"。
微策略-Associate Software Engineer
技術面(視頻面):
- 英文的自我介紹和項目介紹
面試官:看來你英文沒問題,我們後面就用中文面試吧
- 講講你對面向對象的理解吧
- Java中封裝,繼承和多態是怎麼體現的
- Final關鍵字的作用
- Final和finalize的區別
- 重寫和重載的區別
- Java中Synchronized關鍵字的作用
- 知道軟件開發的SOLID原則嗎
- 講講你對REST的理解,和RPC有什麼不同
- 熟悉Java中的哪些Map
- HashMap和TreeMap各個操作的時間複雜度對比(前者基於鏈表 紅黑樹數組,後者基於紅黑樹)
- 講講你熟悉的設計模式(單例模式,裝飾模式,工廠模式,觀察者模式,代理模式,策略模式)
- 講講裝飾模式的思想和實現(舉了Java中IO處理類的例子)
- 講講工廠模式的思想和實現(舉了Java中線程池工廠的例子)
- 講講觀察者模式的思想和實現(舉了一個通過觀察者接口實現UI界面統一更新的例子)
- 講講代理模式的思想和實現(基於接口實現的JDK動態代理和基於類繼承的cglib動態代理,以及基於字節碼文件的靜態代理)
- 講講策略模式的思想和實現(舉了JDBC的例子)
- 講講你瞭解的單例模式寫法,知道的都說一下(餓漢式和懶漢式)
- 這兩種方式是怎麼保證對象唯一性的
- 懶漢式爲什麼需要兩個if語句(分別確保效率和安全性)
- Volatile的作用
- 爲什麼要防止指令重排(順便提了下JVMM的happens-before原則)
(別的問題不記得了,後來還問了一道C艹的題,但我不懂C艹,尷尬了)
也根據簡歷上的語言能力問了幾個問題:
- 你是廣東人吧?
- 日語在哪學的,水平怎樣
口述算法:
- 怎麼反轉一棵二叉樹,這裏的反轉指的是每個節點的左右子樹交換(遞歸至葉子節點)
- 怎麼一層一層地遍歷二叉樹(BFS)
手撕代碼:
- 給定一個括號序列,判斷這個序列是否合法。合法的定義爲:每一個左括號都能在其右側找到一個匹配的右括號,每一個右括號都能在其左側找到一個匹配的左括號。
- 給定一個括號序列,求最少刪除幾個元素後能使這個序列變爲合法序列
- 輸入一個數字N,輸出所有長度爲N的合法括號序列
- 希望有機會合作
- 你有什麼問題想問的嗎(問後面還有幾輪技術面,面試官讓我直接準備主管面)
主管面(視頻面,全英文):
- 自我介紹和項目介紹
詳細地過了一遍項目
- 平時怎麼學習的
- 在校成績如何
- 課餘時間喜歡做些什麼(提到了隔壁工程學院的一些項目)
- 聊了些簡歷上沒寫的校園項目
- 你有什麼問題想問的嗎
總結:面試體驗非常好,一面小哥很親切,說話喜歡用“噠“結尾,並且每道算法題寫完後會引導面試者優化算法至最優解。因爲是外企,比較注重外語能力,一面部分英文,二面全英文。並且外企不根據語言和方向招人,而是統招Software Engineer,面試時也是考察設計模式和算法這類綜合能力爲主。筆試時除了計算機基礎測試外還有英語測試和智力測試。面試結果下來地很快,一面當場告知通過,二面結束後3分鐘告知通過,3個工作日後收到offer。