博主本人是非科班碩士,今年三四月份時開始刷題準備找作業,實習加秋招投了很多大廠&中廠,但是有小一半都沒能進面試,秋招最終拿到了OPPO提前批測開、騰訊音樂后臺開發、阿里云Java開發的offer,寫這篇文章是為了復盤順便記錄面試經歷(一段痛苦迷茫難忘的時光),然后為和我一樣到研二才開始學這些的半路出家者提供可以快速掌握面試所需知識的一些知識點outline(攢攢人品),
重申:想好好學計算機的一定要一點點的看書構建知識體系,本文學習路線僅為提供快速混進春招秋招的隊伍接受各種面試捶打的捷徑,本人知識量有限,如有錯漏請指出,感謝,
OUTLINE
- 后端崗位需要掌握的知識點
- Java 相關
- 計算機網路
- 資料結構和演算法
- 作業系統
- 計算機組成原理
- 資料庫
- Linux
- 設計模式
- 其他
- 博客資料推薦
- 面經部分
- 春招實習階段
- 1. 騰訊 (不知道哪個g) 的事務型后臺開發 (掛)(有認真復盤)50min
- 2. 阿里-釘釘 測驗開發 筆面 (掛) 1h
- 3. 阿里 (不知道哪個部門給我撈起來的) 測驗開發 一面 (又掛了)1h30min
- 4. 美團 Java開發 一面(掛) 40min
- 5. 網易互娛 游戲測驗開發 一面(過)50min
- 6. 網易互娛 游戲測驗開發 二面(過)1h
- 7. 京東 (廣告資料部) 大資料開發 兩面連著 (過) 1h+1h10min
- 8. 位元組 Java開發 一面(過)1h10min
- 9. 位元組 Java開發 二面(掛)1h
- 秋招正式階段
- 1. 位元組 提前批測驗開發 一面(掛)(有認真復盤) 50min
- 2. OPPO 提前批 測驗開發 一面(過)40min
- 2. OPPO 提前批 測驗開發 二面(過)30min
- 3. 騰訊音樂-QQ音樂 后臺開發 一面(過)1h20min
- 4. 騰訊音樂-QQ音樂 后臺開發 二面(過)50min
- 5. 阿里云 JAVA開發 一面(過)1h
- 6. 阿里云 JAVA開發 一面(換了一個事業群)(過)1h40min
- 7. 阿里云 JAVA開發 筆面 (過)1h
- 8. 阿里云 JAVA開發 二面(突然打電話的)(過)30min
- 9. 阿里云 JAVA開發 三面 (過)1h
- 10. 阿里云 JAVA開發 主管面 (過)30min
- 11. 阿里云 JAVA開發 交叉面 (過)40min
- 12. 位元組-飛書 大資料工程 一面 (掛)55min
- 附錄1 筆試題1 代碼
- 附錄2 筆試題2 代碼
后端崗位需要掌握的知識點
分成兩部分來說,第一部分是和你選擇的編程語言相關的東西,第二部分是和編程語言無關的計算機基礎,
- 語言相關的東西,如果你選的是Java,那針對這個語法基礎的東西可能不會被問太多,因為Java沒有指標,比較簡單,但是在大部分的一面中,會涉及到:
Java 相關
- 關于面向物件的一些概念(繼承,封裝,多型),并結合JAVA語言特性的一些問題(Java不允許多繼承,引入介面)
- 一些關鍵字(static,volatile,extends, final等)和一些常用類/介面相關(StringBuilder,StringBuffer,Comparator等)
- JAVA的集合類的一些問題,也是常考的,這塊結合資料結構和演算法以及多執行緒,記憶體的東西也能展開很多問題,我自己也總結了一些問題和答案,
- JVM(JAVA 虛擬機)相關問題,這是面試的重點了,Java最大的特性就是他的運行是不依賴作業系統的硬體平臺的(一次編譯到處運行),因為JVM的存在,為Java程式的運行屏蔽了不同作業系統間復雜的差異性,同時又提供了自動的垃圾回收(GC)機制,相對安全的記憶體管理和訪問限制,
JVM涉及到的知識點有:垃圾回收,及 記憶體管理 兩大塊
這部分內容有時間可以好好看看《深入理解JAVA虛擬機》,沒時間可以看馬士兵老師的公開課,或者公眾號“碼海”關于GC和記憶體的文章,也講得很好很細 (這塊就是,平時可能用不到,但是面試需要造火箭所以經常問), - JAVA多執行緒相關內容,也是大部分會結合作業系統問, 這塊也可以看看馬士兵老師的公開課,
- Java的反射機制,泛型等稍高級的特性(會結合spring那些問),
- 與語言無關的部分,就是無論你選擇JAVA,還是C++,或是Python, go,都會被問的東西,無非就是計算機考研408的那四門課,再加上后端開發作業中常用的資料庫和linux,還有網路編程相關的(這個我自己是沒看但是被問過),但是面試中會考察的計算機原理,計網等內容都有限,大致看看面經背背答案就能應付大部分面試了[\doge].
接下來具體列出每個板塊必須要掌握的知識點,需要注意的是,在一點點去找相關知識點看的程序中,需要想辦法把他們連成線和面,盡量去把有限的知識量構建成知識體系,因為面試官問的問題有時候不僅僅只針對一個點的,如果能往深里答那就很加分了,
知識點的列出按照先后順序,列在前面的表示更重要(高頻)
計算機網路
- TCP鏈接可靠建立和取消相關,即三次握手和四次揮手(為什么三次握手能保證鏈接的可靠建立?為什么四次揮手?time_wait為什么2MSL…)
- TCP的可靠傳輸相關,擁塞控制等
- HTTP/HTTPS協議
- UDP協議(和TCP的區別,現實場景中哪些用UDP,哪些TCP)
- IP地址、MAC地址、OSI七層模型(或者 TCP/IP 五層模型)各層模型對應的常見協議也要有所了解
- 常見網路攻擊及應對方法,結合網路協議(DDOS攻擊,TCP SYN Flood等)
資料結構和演算法
這塊結合演算法題去看(應付面試刷完劍指offer就差不多,筆試得多刷力扣)
兩部分來看:
part 1 資料結構:
- 線性表(陣列,鏈表,是基礎)
- 二叉樹(結合演算法,回溯,動歸,分治,非常重要)
- 堆疊,佇列
- 堆
- 圖
part 2 演算法:
- 排序
- 二分法
- 動態規劃(背包問題)
- 回溯(深度優先搜索)
- 遞回
- 貪心
- 分治
- kmp
- LRU
作業系統
- 行程,執行緒概念
- 行程間的通信方式
- 多執行緒(結合JAVA執行緒池問,結合記憶體管理問)
- 各種鎖(JAVA中的synchronized關鍵字,鎖升級程序等等)
- 死鎖,死鎖預防和避免(銀行家演算法)
- 同步問題(生產者-消費者,哲學家進餐問題)
- 孤兒行程,僵尸行程概念
- 虛擬記憶體管理(結合計組,頁面置換演算法)
- 磁盤調度演算法
計算機組成原理
- 虛擬存盤器相關的,快取分頁等
- cache的基本作業原理
資料庫
資料庫部分也可以分為兩個部分,一部分是資料庫操作
- 常用的增刪改查的操作
- 高級一點的操作比如分組排序,join查詢等
另一部分是資料庫原理,包括了索引和并發控制(MYSQL資料庫),
- 索引存盤結構(為什么用B+樹)
- 索引使用相關,主鍵索引,最左前綴原則等
- 資料庫的鎖分類,按照不同方式可以分樂觀悲觀鎖,行鎖表鎖,讀鎖寫鎖等
- 事務(ACID)
- MVCC
還有關于NoSQL資料庫比如redis相關的問題
- Redis的特點(純記憶體操作,性能高,單執行緒多路IO,非關系型)
- Redis的持久化(AOF, RDB)
- 日志相關,redo log, bin log(這個mysql的也有)
- redis記憶體淘汰機制
- 一致性hash
還有分布式資料庫相關的問題,一般涉及主從架構,讀寫分離,一致性保證,性能調優等,
Linux
這塊知道常見的命令就可以,主要分幾個部分,行程管理(ps,top, kill,df),文本編輯匹配(grep,sed,echo,awk),網路通信(ping,ssh, ifconfig),檔案管理(ls,mkdir,cp,mv,rm)等,還有linux
系統的文本編輯器vim的操作
設計模式
- 單例(要會寫代碼,七種寫法,掌握餓漢,懶漢,DCL執行緒安全寫法就可以了)
- 工廠方法模式,抽象工廠模式
- 動態代理
其他
Java后端常問的還有關于Spring家族的問題,如果有自己找一些微服務的小專案練手,可以對這部分的知識重點關注,面試的時候聊聊這個也可以,
博客資料推薦
Java選手可以參考以下博客的基礎知識總結
- JavaGuide
- CyC2018
演算法部分
- labuladong的演算法
面經部分
因為hr面我基本沒有錄音所以就不記錄了,本人其實投了挺多中廠的,但是要么簡歷沒過要么筆試沒過(大廠一般都會給面試機會,但中小廠如果看你沒有相關專案經歷,或者hc沒了就不會面你了,所以投遞的時間點很重要,盡早投,然后就是,筆試很重要啊T-T)
春招實習階段
(這個時候我還啥都不會,所以面試官基本都是問基礎.)
1. 騰訊 (不知道哪個g) 的事務型后臺開發 (掛)(有認真復盤)50min
- 自我介紹(學校,專業,論文),問了專案,為什么找作業不找和現在的論文研究方向相關的東西,論文偏理論還是實踐?
- python 記憶體管理了解嗎 (因為我專案關于機器學習要用python,面試官后來說他們平時用C++,像python這種腳本語言也用)
- python 常用的資料結構了解嗎(回答了類,陣列的切片,然后就扯到了tensorflow,好像面試官不了解這個,就沒問)
- 垃圾回識訓制 (終于問到我會的但是答得亂七八糟)
- java的記憶體空間(堆疊,堆,靜態區)
- 常用的GC演算法(反問了一下是不是指判斷物件是否無用的方法,然后回答了參考計數和根搜索)
- C++熟悉嗎(我說不太熟悉了)
- redis中的資料結構(答了set,list,soret set,hash table)
- 使用redis時記憶體達到瓶頸,集群達到瓶頸?就是快取需要放到記憶體里,不然斷電了就沒了(不會,后來反應過來應該問的是持久化)
- 分布式鎖 ?
- Tcp和Udp區別
- Tcp為什么是可靠的? 三次握手說一下程序
- 服務端發的ack包的值是多少? 如果客戶端發了很多包,那么服務端回的是哪一個包?
- 服務端收到客戶端的SYN后進入什么狀態?
- 四次揮手說一下 (time wait, 多久)
- unix命令(listen什么的)
- mysql用的什么引擎(innoDB)
- 資料庫的并發控制了解嗎(我答了悲觀鎖樂觀鎖和Mvcc)
- 在什么場景下需要用到這些(我答得好像錯了,面試官說mvcc其實是樂觀鎖的一種,他希望這個問題我可以說一下行鎖,共享鎖這些)
- 多行程與多執行緒的區別(媽耶這個我會太激動了然后就答得亂七八糟啰里八嗦…面試官中間問了一下行程之間能不能共享資源,然后說最根本的區別是行程是資源分配的最小單位,執行緒是獨立調度的最小單位)
- 排序演算法知道哪些
- 快速排序的程序說一下,平均的時間復雜度,最好的最壞的情況的復雜度
- 最壞的情況是怎么造成的,既然這樣,如何優化快排,避免最壞情況發生(問了一下是不是就是找靠近中位數的數做基準,我答了在每次遞回選基準數之前先獲取幾個數找中指,以這個中值做基準)
- 你這么優化演算法復雜度還是挺大的(我說那不是就O(nlogn),然后面試官說你這個找中位數可以簡化一下,找三個數出來求中位數,我說我一開始想的是這個,但是想著要是n和3相差不大的話,取整個磁區的中位數也不會增加很多復雜度)
- 有什么問我的?(騰訊的事務型開發做什么,就是后臺,用c++)(校招中比較重要的是哪些方面,基礎知識,計網演算法資料庫作業系統那些,還有就是面試者的研究方向和專案中體現的解決問題的能力,)
2. 阿里-釘釘 測驗開發 筆面 (掛) 1h
兩道代碼題,給一個小時
- 撰寫兩個執行緒,一個執行緒列印‘你好‘、’釘釘’、‘你好‘、’釘釘’……,另一個執行緒列印‘hello‘、’dingtalk’、‘hello‘、’dingtalk’…….然后通過一個main函式啟動這兩個執行緒,列印出‘你好hello釘釘dingtalk你好hello…’
- 判斷111 - 333之間有多少個質數
3. 阿里 (不知道哪個部門給我撈起來的) 測驗開發 一面 (又掛了)1h30min
- 介紹論文專案 ,從專案中取得了哪些能力
- 覺得自己和別的同學比,優勢和弱勢分別是什么
- 在專案中,如何測驗強化學習演算法有效性(感覺是結合測驗,采集的資料要考慮哪些方面)
- hashmap 的作業原理(底層實作?),它是執行緒安全的嗎?
- 悲觀鎖和樂觀鎖的概念和區別
樂觀鎖如何得知訪問的物件是不是被修改了(CAS,加版本號) - 多執行緒如何實作,執行緒啟動
- Runnable和callable的區別
- 堆疊和堆的區別
- 物件存盤在堆疊還是堆里?
資料庫部分(基本全不會):
- 左連接右鏈接
- 資料庫的事務概念,有哪些特性(原子性,一致性,隔離性,持久性)
- 索引加在哪?
- 如何更新資料?
linux:
- 想看一個檔案內容,用什么命令(cat)
- 如何查看日志
- ps -a是什么意思
- 如何列印出檔案中以數字開頭的行
- 正則
- linux 自帶一個檔案編輯軟體VIM?
撕代碼:
輸入10個整數,輸出其中乘積最大的三個數
(要考慮負數哦)
歸并不同的情況,其實是一樣的,,
int[] nums = new int[10];
System.out.print(nums[7]*nums[8]*nums[9]>nums[0]*nums[1]*nums[9]? nums[7]+nums[8]+nums[9]+"":nums[0]+nums[1]+nums[9]+"" );
被噴打字速度?
有什么要問我的?(被夸問了好問題)
- 您為什么要做測驗?
- 在您的實際作業中,如何判斷一個專案/產品已經ok,可以交付了呢?是通過經驗還是有硬性的資料指標這樣?
4. 美團 Java開發 一面(掛) 40min
- Java中常用的集合介紹一下
- HashMap 介紹一下
- HashMap --常用的解決沖突的方法
- jdk 1.7和1.8在hashmap的實作上有什么區別
- volatile關鍵字了解嗎
- 什么場景下會使用volatile關鍵字
- 在一個陣列中找特定的數字
- 一個表里有三個欄位,name, course1_grade, course2_grade, 查找出每門課成績大于80分的人的姓名
- 介紹一下JVM(你了解的部分)
5. 網易互娛 游戲測驗開發 一面(過)50min
- 論文(描述做了什么,為什么這么做,有什么沒解決的問題,接下來有新的解決方向嗎)
- 代碼題:角色A從一個二維矩陣的左上角出發尋找右下角的角色B, 二維矩陣中有障礙物不能通過, 設計一個演算法計算有多少種走法
Example:
下面的3*3的地圖中只有一個障礙物
[
[0,0,0],
[0,1,0],
[0,0,0]
]
總共有2種走法 - 平時會玩游戲嗎,都玩些什么游戲
- 單機游戲和網游在實作上有什么區別
6. 網易互娛 游戲測驗開發 二面(過)1h
- 論文 (為什么用強化學習解決這些問題,怎么采集資料的)
- 演算法題:輸入不確定個數(很多),重新排序使得所有的奇數都在偶數前面,如何插入一個數到已經排好序的陣列中(用什么資料結構實作)
- 玩什么游戲比較多(玩什么英雄,談談對這個英雄的理解)
7. 京東 (廣告資料部) 大資料開發 兩面連著 (過) 1h+1h10min
這一part我沒記面經,只記了代碼題,大致問的題目就是計算機基礎的常規問題,以及針對我的論文的一些問題
代碼題:
-
實作一個函式: input:A = [1,1,2,2,3,3,8], target = 7 output: false
實作一個函式: input:A = [1,1,2,2,3,3,8], range = [3, 5] output:2 -
req_time 10:00:00 click_time 10:00:30 在10:00:00-10:00:30之間這個點擊是延遲點擊
10億條點擊日志 log[req_time,click_time] 10億條點擊日志,統計00:00:00 - 23:59:59內的延遲點擊數
8. 位元組 Java開發 一面(過)1h10min
- 談一談Java中的Hashmap
- hashmap實作中的鏈表用的是頭插法還是尾插法
- Java中并發安全的hashmap有哪些,是如何實作的
- sychronized關鍵字的實作,鎖升級程序
- sychronized是可重入鎖嗎
- 對基本的設計模式有了解嗎
- 寫個單例模式的懶加載,以及執行緒安全的實作
- 二叉樹列印
9. 位元組 Java開發 二面(掛)1h
- volatile 關鍵字了解嗎
- 講一個必須使用volatile關鍵字的場景
- 將hashmap中的所有value列印出來
- 代碼題:
1) 已知一個List list
現在需要寫一個函式,通過這個函式能夠把list中,以"1_"開頭的元素都刪掉,
寫這個函式的代碼,
答案:
public List<String> delet1L (List<String> list){
for(String s:list){
if(s.charAt(0).equals("1") && s.charAt(1).equals("_") ){
list.remove(s);
}
return list;
}
}
2) 已知一個函式f();每次呼叫時,能夠產生[0,N)的等概率的整數,
需要你通過這個函式,產生一個新函式,這個新函式每次呼叫時能夠產生[L,K)的等概率的整數,
3) 有一個整數陣列 8,4,10,5,9,6,14,13,11
求:第一個間斷的數 7
要求:
時間復雜度:o(N)
空間復雜度:盡可能小
-
介紹一下垃圾回收
-
堆有垃圾回收嗎,堆疊有垃圾回收嗎,為什么
-
TCP的三次握手,如果握兩次會有什么問題
-
在一臺電腦上起一個TCP的socket監聽一個埠,再起一個TCP的socket監聽這個埠,它肯定會報錯,如果是起一個TCP的socket監聽一個埠,再起一個UDP的socket會報錯嗎?
答:也會報錯,因為埠屬于系統資源,不能被多個行程共享,一個埠只能被監聽一次
-
垃圾回收都有哪些方式
秋招正式階段
- 這個階段因為是邊實習邊面試,有時候著急了我就躲在樓梯間面試所以沒有錄音也來不及記面經,包括百度兩面,招銀網路科技三面,所以這里只有部分記錄
- 由于我實習專案是大資料開發相關的,所以秋招階段的面試中有涉及比較多的大資料處理和中間件相關知識點,
- 如果想要找大資料開發相關的作業,需要多了解一些流計算工具的底層原理,例如訊息佇列(kafka, RocketMQ),大資料計算平臺相關(Flink, storm, Spark, MapReduce),不同框架和中間件的基本原理,使用場景,以及高性能資料庫相關的內容,
1. 位元組 提前批測驗開發 一面(掛)(有認真復盤) 50min
-
記憶體泄露和記憶體溢位有什么區別
-
http 和https有什么區別,https加密的方式和方法知道嗎
-
tcp 和udp的區別,說一下這兩個協議在生活中的應用場景,微信的什么是用TCP什么是UDP
微信用的是HTTP短鏈接和TCP長連接,登錄驗證身份資訊等用的http,訊息使用TCP長連接,視頻是UDP -
面向物件的三個特征:繼承,多型,封裝,分別描述
-
行程和執行緒的區別
-
執行緒創建的方式
一、是繼承Thread方法;首先繼承Thread方法,重寫Thread的run()方法
在main()方法里創建一個MyThread物件,呼叫該物件的start()方法,start()方法會通過對系統底層的一系列操作,創建出一個相應的執行緒,與當前執行緒并發執行,如果直接呼叫run()方法,程式將執行完run()方法后才會執行main()方法中后面的代碼,這樣就是單執行緒執行而不是多執行緒并發執行了,
二、是實作Runnable介面; 使用Runnable介面與繼承Thread類的用法相似
不同的是,實作Runnable介面的類中沒有start()方法,所以要用Thread構造個方法開啟執行緒
三、是實作Callable介面和Future創建執行緒,首先創建Callable介面的實作類CallableThread,實作call()方法,并且有回傳值,Callable介面是一個帶泛型的介面,泛型的型別就是執行緒回傳值的型別,實作Callable介面中的call()方法,方法的回傳型別與泛型的型別相同, -
代碼:出現次數超過一半的數
import java.util.Scanner;
public class Main {
public int MoreThanHalf(int[] nums) {
int ma = nums[0];
for(int i=1, c = 1; i<nums.length; i++){
c = nums[i] == ma ? c+1:c-1;
if(c==0){
ma = nums[i];
c =1;
}
}
int c = 0;
for(int v:nums){
if(v == ma) c++;
}
return c > (nums.length/2) ? ma :0;
}
}
-
智力題:7克、2克砝碼各一個,天平一只,如何只用這些物品(最少的次數)將140克的鹽分成50、90克各一份
答:第一步:把140克鹽分成兩等份,每份70克,
第二步:把天平一邊放上2+7克砝碼,另一邊放鹽,這樣就得到9克和61克分開的鹽,
第三步:將9克鹽和2克砝碼放在天平一邊,另一邊放鹽,這樣就得到11克和50克,于是50和90就分開了,
2. OPPO 提前批 測驗開發 一面(過)40min
- 介紹實習專案(介紹廣告后臺系統的架構,分布式資料庫ck,doris,資料遷移基于什么需求,最終選擇Doris是為什么)
- 能不能講一下Java 的GC機制
- docker容器這塊有了解嗎,在哪些場景下使用過
- 在開源社區有貢獻過代碼嗎(沒有)
- 代碼題:有一段未知長度的字串,需要去掉以下條件的字串,第一個條件是邏輯上連續(ASC碼連續)的三個字串例如“ABC”,第二個條件是第一個和第三個相等的字串,例如“ABA”,第三個條件是第二個和第一個或第三個不相等的字串,例如“ABD”. (其實就是除了第二個字串必須要和第一個或第三個相等但三個不能全相等也不能連續才會被保留,例如“ABB”, “AAB”)
- 假設給你一個高跟鞋,你如何測驗它
- 對測驗框架有了解嗎
- CI,CP,CD接觸過嗎
- 邏輯題:假設你站在一面鏡子前,現在就有個問題,為什么鏡子可以顛倒左右而不是顛倒上下的
- 你可以就專業技識訓作業內容提一個問題
2. OPPO 提前批 測驗開發 二面(過)30min
- 有沒有自己獨立開發完成的功能模塊,詳細講述一下
- 你剛剛說你需要做壓測,是用什么工具,具體怎么做的
- 除了實習經歷外,自己在學校有別的開發經歷嗎
- 在學校的社團活動參與過嗎(不是hr面但是問了這種問題,,開始閑聊)
3. 騰訊音樂-QQ音樂 后臺開發 一面(過)1h20min
- 介紹一下實習專案
- 說一下面向物件的特性,具體說一下多型吧
- 看你論文和學校專案是做強化學習演算法的,實習是做大資料的,為什么想要找后臺開發的作業
- 為什么會選java作為主語言
- 介紹一下你知道的JVM(為什么有這個東西,用來解決什么問題,記憶體管理,垃圾回收,說了半個小時)
- 垃圾回收的STW你知道嗎,它會如何影響機器性能
- Java里的集合介紹一下,幾個類
- 執行緒安全的集合有哪些
- LinkedList和ArrayList的底層實作有什么不同,應用場景有什么不同
- ConcurrentHashMap 的實作,底層如何保證執行緒安全(JDK1.7,1.8的實作有什么區別,鎖粒度區別)
- 介紹一下Java里的鎖吧(鎖升級)
- 并發安全的操作
- 多執行緒的記憶體管理了解嗎
- 行程間通信的方法有哪些
- sychronized關鍵字的作用
- TCP和UDP介紹一下 (三次握手四次揮手)
- 握手時除了序列號還傳了什么
- 如何確保TCP報文有序性,握手的報文保存嗎
- 如果有一個客戶端不斷發送握手請求,導致服務器宕機,如何解決(SYN 泛洪攻擊)
- 訊息佇列有了解嗎,用過哪些
- NoSQL的資料庫了解嗎
- redis有哪些特點
- redis的持久化如何做
- 集群的同步怎么實作的
- 有什么問題要問我
4. 騰訊音樂-QQ音樂 后臺開發 二面(過)50min
- 介紹一下你的論文吧(15分鐘)
- TCP的三次握手介紹一下
- 如果我有一個服務器的TCP請求總是超時嚴重,你會怎么考慮解決(從存盤的角度考慮一下)
- 代碼題:給定播放量陣列 [225,321,456,788,1023,223,456,221,566]
飆升的定義:連續4天播放量增長;求在給定的這一個周期內飆升的次數
5. 阿里云 JAVA開發 一面(過)1h
- 介紹一下論文專案(應用場景)
- 介紹一下實習專案
- 能介紹一下Jstorm嗎,它的冪等性是怎么實作的
- Jstorm在流計算中能達到的語意是什么,是At least once 還是 exactly once,它能不能做到exactly once呢?
- 分布式計費需要做到exactly once,業務上是如何去確保的呢
- 你遇到過流計算中因為某個節點的問題導致的整體性能被影響的情況嗎,你是如何解決的
- (因為我提到了資料丟失)你的系統是exactly once的,為什么會有資料丟失,舉個例子
- sink端寫資料庫怎么實作的,它應該是知道每條資料有沒有寫成功的 (結合業務的問題)
- (然后我提到了我們要遷移資料從hdfs到Doris),因為hdfs是沒有主鍵的非關系型,而doris是需要主鍵的,你們是怎么做這個遷移的
- 查詢的是最終狀態,如何保證從doris中查詢到的是正確的終狀態結果(寫增量,存的是什么)
- 為什么不用spark
- kafka拉取資料的時候,是按照Kafka的時間戳點位拉資料的,但是計算式按照kafka的點位還是真實的點擊時間算(可能由于網路延遲或是網路延遲,產生kafka中資料的亂序)
- kafka亂序的問題如何解決(生產者端和消費者端兩個角度,結合業務)
- Java多執行緒的記憶體模型有了解嗎(可見性,主存,執行緒記憶體,同步資料)
- Java集合了解嗎,hashmap原始碼看過嗎,記憶體結構了解嗎,
- hashmap是怎么處理hash沖突的
- 代碼題:1. 有一個等引數列陣列,但是缺失了一項,如何快速找出缺失的數?
2.如果缺了兩項呢?(不一定是連續的兩項,通過差值除以二取整可以確定這兩個缺失項的對稱軸,那么問題轉化為找一個缺失項)
6. 阿里云 JAVA開發 一面(換了一個事業群)(過)1h40min
- 介紹一下論文
- 介紹一下實習專案
- 專案中是如何測這些分布式資料庫的性能的
- 分布式架構的CAP原則你了解嗎?
- 結合你剛剛描述的專案場景,下層服務在發布的時候有灰度發布環節嗎?那么磁區容錯機制是體現在哪里?
- 你實習的日常開發流程是什么樣的
- 你實習專案中的報表資料中臺指的是什么,上下游具體承接的是什么你知道嗎?
- 你們的業務承接上游日志用的訊息佇列工具是什么
- 為什么考慮使用kafka?
- 你知道kafka有哪些缺點或是局限性嗎
- kafka為什么不能實作exactly once 語意
- kafka是基于什么去實作高吞吐量的,和無限擴容
- 常用的注冊中心例如zookeeper,evaka這些是CAP中的哪一個
- Java中哪些集合是執行緒安全的嗎
- concurrentHashMap 和 vector 在保證執行緒安全時的實作方式有哪些不同
- hashmap的記憶體結構是什么樣的
- jdk1.8之后為什么鏈表長度大于8之后才會轉成紅黑樹(從紅黑樹和鏈表的查找時間復雜度考慮)
- Java鎖的型別有了解嗎
- 什么是自旋鎖
- wait和yeild兩個方法有什么區別
- JVM的記憶體模型了解嗎,介紹一下
- GC演算法有哪些,介紹一下
- G1收集器可以實作標記清除的時候不產生記憶體碎片,是如何做到的
- 類加載機制你有了解嗎
- 雙親委派機制是什么
- 我們可以自己自定義一個加載器去加載jdk自帶的類嗎?(破壞雙親委派機制,例如利用反射機制初始化資料庫連接池)
- innoDB引擎的索引是怎么實作的?為什么用B+樹不用hashmap
- 執行緒池中有哪些拒絕策略
- Java中有哪些網路IO模型
- HTTP建立連接的程序是什么樣的
- 現在需要做一個多人實時在線的互動網游,做這種服務器一般用什么網路協議
- 你了解哪些網路攻擊方式, 是遇到過還是只是了解
- 資料庫的事務你了解嗎
- 事務的隔離級別你了解嗎
- Redis你了解嗎
- 能講一下spark是如何分配任務的嗎
- 你以后想做哪一塊的東西,對作業內容有什么自己的想法嗎
7. 阿里云 JAVA開發 筆面 (過)1h
因為筆試只有0.2AC所以有一輪補筆試,題目比統一筆試簡單一些,1h兩道演算法題
- 第一題:
現有一個字串它的構成是崗位名稱和,的組合,如“研發,產品,產品,研發”,要求輸入一個匹配模式,如xxyy(可以以這種簡單的字符來標識), 來判斷該字串是否符合該模式, 舉個例子:
匹配模式 = “xyyx”, 字串 = “研發,產品,產品,研發” 回傳 ture
匹配模式 = “xxyy”, 字串 = “研發,產品,產品,研發” 回傳 false
匹配模式 = “yxxy”, 字串 = “研發,產品,產品,研發” 回傳 ture
(答案見文末 附錄1) - 第二題:
一個浴室有3個淋浴間,現在有10個人需要洗澡,5男5女,要求程式模擬10個人(執行緒),隨機去浴室洗澡,確保每個人都洗過澡了,并且避免男女同時使用浴室,每個人洗澡的時間為1s到10s之間的一個亂數,請按照以上描述完成代碼,
(答案見文末 附錄2)
8. 阿里云 JAVA開發 二面(突然打電話的)(過)30min
忘記錄音了,問的比較少,主要是針對專案和論文
- 實習專案介紹
- 論文介紹
9. 阿里云 JAVA開發 三面 (過)1h
- 論文介紹
- 在學校寫過的代碼
- 主要是針對實習專案中參與的模塊和具體開發內容進行具體的提問 (問得很細,具體到每個小指標的數值,包括資料來源,下游業務,具體的性能測量量級和數值范圍等,40min)
- 你身邊肯定有一些你覺得很厲害的同學吧,你覺得你和他們的差距在哪
- 你為什么想要做工程方向,而不是繼續搞科研
- 有什么要問我的
10. 阿里云 JAVA開發 主管面 (過)30min
這一面就只是介紹專案,像是實習轉正答辯一樣有結構地去講做過的專案內容,為什么這么做,具體怎么做,然后提了一些業務上的小問題,
然后又問到了為什么要做開發而不是演算法
11. 阿里云 JAVA開發 交叉面 (過)40min
- 為什么你在廈門大學要去北京實習??
- 實習專案是做大資料平臺,具體作業內容是偏Java工程還是偏資料工程
- 大資料相關的工具你是實習的時候才接觸還是之前就有學過
- 為什么研究生的方向偏演算法,但是想轉工程(每一面都問這個問題,hr面也問了)
- 你感興趣的技術方向是什么
- 你清楚Flink的基礎原理嗎 (提到了Flink,storm,spark的區別)
- 講講原生流處理是什么意思
- 講講checkpoint吧
- 對應的savepoint你知道嗎
- 給一個多項式,他的總和為s=1×2+2×3+…+n×(n+1),用多執行緒的方式實作求s
- 你有什么問題要問我嗎
12. 位元組-飛書 大資料工程 一面 (掛)55min
基本問題都答出來了,但是太久沒刷題,一個反轉鏈表都沒寫出來,就掛了
- 介紹論文,專案
- static關鍵字
- static除了修飾方法和屬性,還能修飾什么
- 你知道記憶體泄露的根本原因是什么嗎
- 談談你對堆疊的理解
- 多執行緒了解嗎,Java實作多執行緒的方式你了解嗎
- 執行緒池的核心引數有哪些
- 阻塞佇列你知道有哪些
- 鎖的狀態和種類你了解嗎
- sychronized關鍵字屬于哪種鎖
- 你知道樂觀鎖是怎么實作的嗎
- 描述一下CAS演算法吧
- 你看過jdk1.8中CAS的原始碼嗎,concurrent包里有個原子類
- kafka 的高吞吐量是怎么實作的
- 零拷是怎么實作的
- kafka的順序寫是怎么實作的
- kafka怎么保障實作exactly once 的(訊息的生產和消費兩個方面去思考)
- kafka訊息發送方式,同步異步你了解嗎
- flink里面的watermarker你了解嗎
- spark的checkpoint機制你了解嗎
- 代碼題:反轉鏈表
附錄1 筆試題1 代碼
import java.util.HashMap;
public class StringMatch {
public static void main(String[] args) {
String str = "研發,產品,產品,研發";
String target = "yxxy";
System.out.println(isMatch(str,target));
}
public static boolean isMatch(String str, String target){
String[] strings = str.trim().split(",");
int nums = target.length();
if(strings.length != nums) return false;
StringBuilder tarBui = new StringBuilder(target);
HashMap<Character,String> matches = new HashMap<>();
for(int i = 0; i<nums; i++){
Character a = tarBui.charAt(i);
if(matches.containsKey(a)){
if(!matches.get(a).equals(strings[i]))
return false;
}else{
matches.put(a,strings[i]);
}
}
return true;
}
附錄2 筆試題2 代碼
import java.util.Random;
public class multiThreads {
static BathRoom b1 = new BathRoom();
static BathRoom b2 = new BathRoom();
static BathRoom b3 = new BathRoom();
public static void main(String[] args) {
for(int i = 1; i<=10; i++){
if((i&1)==0) {
new ShowerThread(true, "t"+i).start();//true : male
}
if((i&1)==1) {
new ShowerThread(false, "t"+i).start();// false: female
}
}
}
}
class ShowerThread extends Thread{
public String name;
public int time;
public boolean male;
@Override
public void run() {
Random random = new Random();
this.time = random.nextInt(10)+1;
while(true){
try {
if(getroom()) break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public boolean getroom() throws InterruptedException {
if(multiThreads.b1.status == false){
if((multiThreads.b2.status == false || multiThreads.b2.maleUsing == this.male)
&& (multiThreads.b3.status==false||multiThreads.b3.maleUsing == this.male) ){
multiThreads.b1.using(this);
return true;
}
}
if(multiThreads.b2.status == false){
if((multiThreads.b1.status == false || multiThreads.b1.maleUsing == this.male)
&& (multiThreads.b3.status==false||multiThreads.b3.maleUsing == this.male) ){
multiThreads.b2.using(this);
return true;
}
}
if(multiThreads.b3.status == false){
if((multiThreads.b1.status == false || multiThreads.b1.maleUsing == this.male)
&& (multiThreads.b2.status==false||multiThreads.b2.maleUsing == this.male) ){
multiThreads.b3.using(this);
return true;
}
}
return false;
}
public ShowerThread(boolean male, String tname) {
this.name = tname;
this.male = male;
}
}
class BathRoom {
public volatile boolean status; //true: using; false: idle
public boolean maleUsing;
public synchronized void using(ShowerThread t) throws InterruptedException {
this.status = true;
this.maleUsing = t.male;
if(this.maleUsing==true){
System.out.println(t.name + " male using..." + t.time);
}else{
System.out.println(t.name + " female using..." + t.time);
}
t.sleep(t.time *1000);
this.status = false;
}
public BathRoom() {
this.status = false;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232466.html
標籤:其他
