S:情境,作這個項目的背景
T:任務,本身在項目中負責哪些地方
A:行動(☆),對用到的技術很是瞭解,好比用的什麼框架,爲何要用這個,和其餘框架(技術)相比的優點等等。
R:結果(☆),項目達到了什麼樣的效果,本身有沒有總結思考哪些地方作得好,哪些地方還能夠改進。公司都喜歡有本身思考的人html
---------------------------------------------------------------------------------------------------------------------------------------------java
一面:mysql
1 寫一個題,找一個無序數組的中位數
2 寫了個快排,而後讓我找到無序數組第k大的一個數,我說先排序再找,實際上能夠用快排的partition函數。
3 快排的時間複雜度,最壞狀況呢,最好狀況呢,堆排序的時間複雜度呢,建堆的複雜度是多少,nlgn。
4 操做系統瞭解麼,Linux和windows
5 說說Linux的磁盤管理,一臉懵逼
6 Linux有哪些進程通訊方式,五大件
7 Linux的共享內存如何實現,大概說了一下。
8 共享內存實現的具體步驟,我說沒用過
9 socket網絡編程,說一下TCP的三次握手和四次揮手,中間網絡很差,面試官都沒聽清楚,很尷尬
10 跳過網絡,問了項目的一些東西
11 問我如何把docker講的很清楚,我從物理機,虛擬機到容器具體實現稍微說了下。
12 問我cgroup在linux的具體實現,不會。
13 多線程用過哪些,chm和countdownlatch在實習用過
14 不得不吐槽下今天牛客的視頻網速,不知道啥緣由卡的一比,明明下載網速很正常啊,牛客視頻每秒才20k。。瘋狂掉線搞得很蛋疼。 linux
二面: c++
1 自我介紹
2 Java的集合類哪些是線程安全
3 分別說說這些集合類,hashmap怎麼實現的,扯了不少
4 MySQL索引的實現,innodb的索引,b+樹索引是怎麼實現的,爲何用b+樹作索引節點,一個節點存了多少數據,怎麼規定大小,與磁盤頁對應。
5 MySQL的事務隔離級別,分別解決什麼問題。
6 Redis瞭解麼,若是Redis有1億個key,使用keys命令是否會影響線上服務,我說會,由於是單線程模型,能夠部署多個節點。
7 問我知不知道有一條命令能夠實現上面這個功能。不知道
8 Redis的持久化方式,aod和rdb,具體怎麼實現,追加日誌和備份文件,底層實現原理的話知道麼,不清楚。
9 Redis的list是怎麼實現的,我說用ziplist+quicklist實現的,ziplist壓縮空間,quicklist實現鏈表。
10 sortedset怎麼實現的,使用dict+skiplist實現的,問我skiplist的數據結構,大概說了下是個實現簡單的快速查詢結構。
11 瞭解什麼消息隊列,rmq和kafka,沒細問
12 寫題時間到。第一題:寫一個層序遍歷。
13 第二題:寫一個插入樹節點到一顆排序樹的插入方法,使用遞歸方式找到插入位置便可。
14 第三題:一個有向圖用鄰接矩陣表示,而且是有權圖,如今問怎麼判斷圖中有沒有環。
15 我說直接dfs走到原點即爲有環,剛開始寫的時候我又問了一嘴是否是隻要找到一個就行,面試官說是的,而後我說這樣應該用bfs,有一次訪問到原節點就是有環了。
16面試官問我不用遞歸能不能作這個題,其實我都還沒開始寫。而後我就說沒有思路,他提示我拓撲圖。我沒明白拓撲圖能帶來什麼好處。如今一想,好像當訪問過程當中找不到下一個節點時就說明有環。作一個訪問標記應該就能夠。
17 第四題:一個二叉樹,找到二叉樹中最長的一條路徑。
我先用求樹高的方式求出了根節點的左右子樹高度,加起來即是。
18 而後面試官提示須要考慮某個子樹深度特別大的狀況,因而我用遍歷的方式刷新最大值,用上面那個方法遍歷完整個樹便可。
19 面試官說複雜度比較高,可是因爲時間問題就說結束了。 面試
三面: redis
三面的面試官真的高冷啊,不苟言笑就算了,我問他問他他都不愛搭理的,搞得我心裏慌得一比,感受涼涼。 算法
1 介紹一下項目
2 你談到的併發技術,chm和countdownlatch怎麼使用的
3 爲何要這麼處理,使用線程池是否是也能夠。我說也能夠
4 操做系統的進程通訊方式,殭屍進程和孤兒進程是什麼,如何避免殭屍進程,我說讓父進程顯示通知,那父進程怎麼知道子進程結束了,答不會。
5 計算機網絡TCP和UDP有什麼區別,爲何迅雷下載是基於UDP的,我說FTP是基於TCP,而迅雷是p2p不須要TCP那麼可靠的傳輸保證。
6 他說不對,我說是否是由於要創建鏈接,開銷比較大,他說不對
7 我說p2p的發送節點不少,因此不是那麼須要各類傳輸保證,他說不對。
8 我說TCP會自動分包而TCP能夠本身定義數據長度。。他仍是說不對。
最後他說算了。咱們問下一個吧。
9 操做系統的死鎖必要條件,如何避免死鎖。
10 寫一個LRU的緩存,須要完成超時淘汰和LRU淘汰。
我說用lhm行不行,他說用linkedlist和hashmapspring
---------------------------------------------------------------------------------------------------------------------------------------------sql
一面
面試官很是和善,很好說話。他說面試流程是,1.項目,2.基礎(OS,network,組成原理),3.算法,問我ok嗎. 固然ok了啊~
我先說了下項目,由於本科生還沒幹過啥,就說了一下和老師作的科研的項目,是一個關於算法的,感受沒加分...
而後問基礎:
假設一個大型遊戲有10+G,內存僅有2G,怎麼讓它跑起來?
我說是虛存嗎,我直接說虛存的設計吧,hr:嗯,ok~,
wo: balabala ~... 說了虛存,從一條CPU打過來的指令開始解釋,感受還不錯,
hr:緊接着又問了頁表是每一個進程都有的仍是僅有一個。二級頁表的做用,進程的邏輯空間大小看什麼。反正問道你答不出來,或者他以爲ok了爲止
網絡
解釋一下一個數據包從一個子網到另外一個子網的過程,MAC地址,IP怎麼轉化的,說清楚
算法題,寫代碼
1) 怎麼判斷一個有向無環圖有沒有環(topo)
2) 一顆二叉樹的直徑,我跟他說兩次bfs就行了,他不信,還讓我證實了一下...啊艱難的證實
還問了一下java基礎,讓我解釋hashmap
hr:ok,有什麼想問個人?
wo:能夠給出一個評價嗎?hr說還ok,說頭條比較看重溝通,說我這部分乾的還行。
3分鐘後2面通知就來了
二面
1.看簡歷才知道我是本科生,說他歷來沒面過本科生。想讓我介紹一下。
說一個解決的ACM最難的題目
wo: what???都退役一年了。說了個上次newcoder上作的。解釋了好大半天
語言,
1)說一下c++和java的區別
這裏扯了一堆,
2) 從c++切到java要注意啥
wo: what????沒懂,能說詳細點嗎
hr:student1=student2,java和c++有啥區別
wo: 終於聽懂了
3)多太瞭解??
class base{print}
class supper exend base{。。。@override print()}
base b = new supper();
b.printf();
輸出哪一個的.
wo: supper
hr:爲何?
不太清楚
hr: 你能夠猜一下
我說,由於b指向的內存是supper,而後...
hr: 那你認爲這是在編譯器決定的仍是運行時,根據你答的
w: runtime
ok算法來了
算法
1) 內存僅有1kw,有1億的int在磁盤上 O(n) 找第k大。
我說若是內存沒限制我卻是有 O(n)的作法。他說不行,給個提示,值是均勻的1億~ 2億,最終提示後我解決了
2) 二叉樹後續遍歷,非遞歸
3) 一個筆試題,(貌似他們不知道有筆試...)
一個開放問題,他說超綱了,應該是想拒絕我了(55555555555~)
數據庫存在不一樣的服務器上,爲了讓不一樣的服務器負載均衡,如今加一臺服務器怎樣才能讓數據搬遷最少。我答了用hash,再hash借鑑hashmap的策略。
hr: 有什麼問題要問我嗎?
wo: 評價一下我...
3面3分鐘後到,2面說3面是他boss.
三面
3面問的很快,彷佛想知道你知識的上界在哪裏。
介紹
java JVM,JNI,Spring
wo: 不知道...
hr: 語言基礎是吧
w: en~
算法題
第k大,寫代碼,我就寫了快排的思想
網絡
1)3次握手,4次揮手
我說我3次握手後,他問爲何。我還沒答呢,
他說不知道能夠說不知道,不要亂答。
2)緊接着他就問了 滑動窗口後擁塞。也是問爲何,我說擁塞是爲了,TCP公平。hr說不是。。。哎這裏每次都錯
問了一個比較難的題
問我搜索系統,幾千萬個網頁,查詢怎麼作,
哎,答的很差。後來就吃午餐了
吃午餐時和3面hr一塊兒吃的,他問了我一些其餘問題,感受有點套路
敝校省內排名
在應屆生中什麼是一流的互聯網公司
拿了幾個offer
爲何不考研
好了,感謝上一位大佬。這裏獻上個人經歷
-----------------------------------------------------------------------------------------------------------------------------
螞蟻金服一面:
1.你這個項目用到了AOP,那你對AOP瞭解多少(主要回答了靜態代理,動態代理,動態代理與靜態代理的區別,JDK代理和CGLIB代理的區別),
2.假如如今讓你設計分佈式緩存系統,你會怎麼設計,果斷Redis,說了下Redis優勢,線程池技術,
3.Redis和Memcache的區別,
4.線程池的幾個參數,拒絕策略有哪些(這種問題已經爛熟於心,甚至還給同事們培訓過),
5.mysql查詢速度慢,你會怎麼優化,
6.索引是一種什麼原理,能不能描述一下,
7.假如如今id是192,你說一下在B+Tree的搜索過程,
8.如今有一種讀多寫少的場景,你怎麼設計(回答了Canel監聽binlog,從Redis讀。可是面試官質疑不能一致性。而後他說讀寫分離,而後我質疑他讀寫分離並不能保證一致性,他說這點時延很小[哈哈])
-----------------------------------------------------------------------------------------------------------------------------
頭條面試:
一面(半小時):
自我介紹 直接作題:
n個整數的無序數組,找到每一個元素後面比它大的第一個數,要求時間複雜度爲O(N),在面試官提醒下寫出來了,用棧+棧底指針 而後開始問項目…blabla
介紹5種IO模型 異步編程的事件循環
操做系統爲何要份內核態和用戶態
爲何要有page cache,操做系統怎麼設計的page cache
二面 (40分鐘):
讓我介紹項目 而後各類問 問的比較細 STL裏resize和reserve的區別 擼一個std::lower_bound,不斷優化,直到最壞複雜度也爲O(logN)
聽我繼續介紹項目 C++11新特性 怎麼實現線程池
用到哪些C++的新特性 怎麼喚醒,調度線程
什麼是LRU緩存 怎麼設計的LRU緩存,
詳細 三面(半小時):
一個看起來就很厲害的中年男子 聽我吹項目,主要是(kv數據庫) 介
紹B樹 越詳細越好 介紹數據庫中的WAL技術
實現一個二叉樹的持久化方案,能夠僞代碼,必須用指針 主要是序列化和反序列化的過程 (卡在指針的持久化,而後他不是很滿意,說我應該作得出,而後我只能把個人另外一種不用指針的方案給他講,纔算勉強過)
實現二叉樹的層序遍歷 再按層輸出
-----------------------------------------------------------------------------------------------------------------------------
JAVA基礎篇:
synchronized 鎖實現原理:
synchronized 是由一對 monitorenter/monitorexit 指令實現的,monitor 對象是同步的基本實現單元。
在 Java 6 以前,monitor 的實現徹底是依靠操做系統內部的互斥鎖,由於須要進行用戶態到內核態的切換,因此同步操做是一個無差異的重量級操做,性能也很低。
但在 Java 6 的時候,Java 虛擬機 對此進行了大刀闊斧地改進,提供了三種不一樣的 monitor 實現,
也就是常說的三種不一樣的鎖:偏向鎖(Biased Locking)、輕量級鎖和重量級鎖,大大改進了其性能。
synchronized 鎖升級原理:
在鎖對象的對象頭裏面有一個 threadid 字段,在第一次訪問的時候 threadid 爲空,jvm 讓其持有偏向鎖,並將 threadid 設置爲其線程 id,
再次進入的時候會先判斷 threadid 是否與其線程 id 一致,若是一致則能夠直接使用此對象,若是不一致,則升級偏向鎖爲輕量級鎖,
經過自旋循環必定次數來獲取鎖,執行必定次數以後,若是尚未正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了 synchronized 鎖的升級。
鎖的升級的目的:
鎖升級是爲了減低了鎖帶來的性能消耗。在 Java 6 以後優化 synchronized 的實現方式,使用了偏向鎖升級爲輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。
Java synchronized原理總結
https://zhuanlan.zhihu.com/p/29866981
Java ClassLoader 工做機制
http://www.javashuo.com/article/p-cnrdnlgh-es.html
-----------------------------------------------------------------------------------------------------------------------------
SSH原理篇:
Spring MVC 啓動過程源碼分析
http://www.javashuo.com/article/p-sumresbv-be.html
spring的啓動過程——spring和springMVC父子容器的原理
https://my.oschina.net/u/3525396/blog/1021836
SpringBoot 應用程序啓動過程探祕
http://www.javashuo.com/article/p-nwrpgqkz-hc.html
SpringBoot啓動流程解析
https://www.jianshu.com/p/87f101d8ec41
-----------------------------------------------------------------------------------------------------------------------------
算法篇:
常考算法
https://www.cnblogs.com/cangqiongbingchen/category/694047.html
開放地址法與鏈表法的優缺點及其實現
https://blog.csdn.net/mark555/article/details/22038151
LRU算法實現
http://www.javashuo.com/article/p-psavtddb-dr.html
其餘篇:
redis使用規範
https://www.infoq.cn/article/K7dB5AFKI9mr5Ugbs_px
redis數據結構
dubbo配置
https://blog.csdn.net/wanglei0622/article/details/44407815
dubbo源碼解析
https://www.jianshu.com/p/1c53767359c6
Hystrix 分佈式系統限流、降級、熔斷框架
http://www.linkedkeeper.com/1157.html
短URL系統是怎麼設計的
https://www.zhihu.com/question/29270034
微信紅包的架構設計簡介:
https://www.open-open.com/lib/view/open1430729729960.html
---------------------------------------------------------------------------------------------------------------------------------------------