我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

前言-

致那些迷茫的JAVA面試者,致那些奮發的年輕人,致自己。寫這篇博文主要也是對我的成長道路的記錄,面試受挫後的反思,及對自己的勉勵。

本人介紹:3年多經驗的程序員

背景:因水平有限,及對部分面試問題記憶及理解有限,可能有些問題並不能表達準確。掌握技術有限,學習主動性一般(雖遇到問題善於思考鑽研,但如果沒有遇到問題比較放縱自己...被自由,輕鬆,安逸迷失心智),以及原公司項目背景因素,基本不需要太多新的技術框架支持,更沒有涉及消息中間件,高併發分佈式等等相關較主流技術,技術體系相對較老。綜上導致我對很多新技術並不是太瞭解。

面試經驗背景:基本公司都是按簡歷掌握技術來問(當然也有超綱不按套路出牌的),如果你簡歷掌握技術什麼都不寫,也有可能接到面試邀請,那麼面試官問題可能就比較廣了,對面試者不利。掌握技術我寫了java基礎:多線程,io/nio,jvm,集合底層,tcp/ip協議,socket,websocket。spring,springmvc,xml,設計模式,eclipse plugin開發,數據庫,前端(基本沒有什麼人問,面的後端開發,也許熟悉前端也是加分項)瞭解netty、mybatis、redis(實際就是看了一點點).

項目經驗背景

1.原公司我所在的部門做的是一款大型工具,web項目。項目週期很長很長,至今還在做,具體不細說,技術上就用了上述我寫的部分技術(未涉及redis、netty、mybatis、springmvc),作為項目經歷,該項目競爭力不強。

2.朋友找我做的私活項目,只接觸了一個星期左右,朋友就跟接活人鬧崩了,然後不了了之。但是我還是把項目寫進項目經驗了(投遞的時候寫,自帶的紙質簡歷就把它去掉,以防面試官問到我一臉懵逼...機智如我,當然也有公司不需要你的自帶簡歷,那就沒辦法,他問到的話我就忽悠,坦白)。實際就是個特別小的項目,用到的技術springmvc,mybatis,redis,activemq,阿里雲對象存儲等等。這個項目我只稍微瞭解了一點點springmvc,mybatis,redis最最基本的用法,可以說沒啥用。

面試經歷(具體錄用薪資我就不說明了,只說我對薪資+公司福利滿意度。

面試中項目介紹必定要說的,以及項目中的細節問題,這些不細說了。只說技術問題)

按時間先後排序(時間越遠遺忘的問題可能越多。很多重複的,將就看吧)

阿里螞蟻金服(四面)

一面:

1自我介紹

2項目中做了什麼,難點呢。

3Java的線程池說一下,各個參數的作用,如何進行的。

4Redis講一下

5分佈式系統的全局id如何實現。用zookeeper如何實現的呢,機器號+時間戳即可。

6分佈式鎖的方案,redis和zookeeper那個好,如果是集群部署,高併發情況下哪個性能更好。

7kafka瞭解麼,瞭解哪些消息隊列。

8想做業務還是研究。

9然後出了一道題,linux的訪問權限是rwx格式的。使用一個類支持訪問權限的增刪改查,並且注意使用的數據格式以及方法效率,規範。給了一個多小時寫題。

耗時將近30分鐘。

二面:

1 介紹你做的項目和其中的難點。

2 上次面試官問的問題,反射的作用是什麼。

3 數據倉庫,多線程和併發工具等。

4 私有云,docker和k8s等。

5 瞭解哪些中間件,dubbo,rocketmq,mycat等。

6 dubbo中的rpc如何實現。

7 自己實現rpc應該怎麼做

9 dubbo的服務註冊與發現。

10 聽說我是非科班,於是問了些排序算法

耗時將近30分鐘。

三面:

三面不是面試,而是筆試,耗時三個小時,考的是Java核心的基礎。但是好像不能透題,就不說了。都挺有難度的。

大概說一下就是有幾個考點,Java併發的知識點,集合類,線程池,多線程之間的通信等。

HR面:

聊人生談理想,HR小姐姐非常溫柔,交流十分愉快。30分鐘。

騰訊後臺開發面經(五面)

一面:

1 有序數組排序,二分,複雜度

2 常見排序算法,說下快排過程,時間複雜度

3 有N個節點的滿二叉樹的高度。1+logN

4 朋友之間的點對點關係用圖維護,怎麼判斷兩人是否是朋友,並查集,時間複雜度,過程。沒講清楚

1. 初始化元素

2. 實現元素與元素間的聯合操作

3. 實現查找元素所在樹的根節點

4. 解決一個問題,判定兩個元素是否在同一棵樹上(兩個元素是否相互連接)

5 單元點最短路的方法,時間複雜度

6 如何實現關鍵字輸入提示,使用字典樹,複雜度多少,有沒有其他方案,答哈希,如果是中文呢,分詞後建立字典樹?

7 hashmap的實現講一下吧,講的很詳細了。講一下紅黑樹的結構,查詢性能等。

8 Java中的垃圾回收講一下,講了分代,gc算法,gc root可達性分析等

9 講一下兩個項目你都做了什麼把。

10 除了代碼之外你還學習了什麼技術,框架。

11 死鎖是怎麼產生的

12 線程和進程的區別

13 進程的通信方式

14 CPU的執行方式

15 代碼中遇到進程阻塞,進程僵死,內存洩漏等情況怎麼排查。通過ps查詢狀態,分析dump文件等方式排查。

16 Linux瞭解麼,查看進程狀態ps,查看cpu狀態 top。查看佔用端口的進程號netstat grep

17 10g文件,只有2g內存,怎麼查找文件中指定的字符串出現位置。MapReduce分割文件處理。

他說可以用cat | grep 管道處理。

18 Linux的swap瞭解麼,完全不懂。

19 Redis和MySQL最大的區別

20 講一下Tomcat的基本架構和組件,以及請求的整個流程。說了一下connector和container架構和servlet請求過程。

21 MySQL的存儲引擎,有什麼區別。

22 範圍1到1000的數,原本有1000個,互不重複,現多出來1個重複的數,怎麼找到他,統計次數,太慢,求和相減。

23 N個糖果,每次只能取1個到6個,不能不取,你先取,請問是否有必勝策略,怎麼取。

剛開始說不太記得了,面試官提示了幾個例子,找出規律不能為7的倍數,每次取到只剩7的倍數個糖果即可。

二面:

1 快排的時間複雜度,冒泡時間複雜度,快排是否穩定,快排的過程

2 100w個數,怎麼找到前1000個最大的,堆排序,怎麼構造,怎麼調整,時間複雜度。

3 一個矩陣,從左上角到右下角,每個位置有一個權值。可以上下左右走,到達右下角的路徑權值最小怎麼走。

先說了一下dfs遞歸實現。面試官說要優化。

說了一下用迪傑斯特拉的思路,說可以。

4 四輛小車,每輛車加滿油可以走一公里,問怎麼能讓一輛小車走最遠。說了好幾種方案,面試官引導我優化了一下,但是還是不滿意,最後他說跳過。

5 hashmap的實現,hashtable,concurrenthashmap實現。

6 MySQL的索引,B+樹性質。

7 Linux的cpu 100怎麼排查,top jstack,日誌,gui工具

8 Linux大文件怎麼查某一行的內容。

9 Redis內存數據庫的內存指的是共享內存麼

10 Redis的持久化方式

11 秒殺系統的架構設計

三面:

1 十億個數的集合和10w個數的集合,如何求它們的交集。

集合的數字不重複。

我講了兩次循環,兩次hash,以及排序或者合併等方式。。都不對。後來面試官說是對小數組做hash,然後遍歷大數組即可。我完全想錯方向了。

2 十億和數找到前100個最大的,堆排序,怎麼實現,怎麼調整。

3 TCP和UDP的區別,具體使用場景呢。

4 TCP四次揮手講一下過程,最後一次ack如果客戶端沒收到怎麼辦。

5 對於socket編程,accept方法是幹什麼的,在三次握手中屬於第幾次,可以猜一下,為什麼這麼覺得。

6 Linux操作系統瞭解麼,瞭解一點點,就沒問了。

7 對於單例模式,有什麼使用場景了,講了全局id生成器,他問我分佈式id生成器怎麼實現,說了zk,問我zk瞭解原理不,講了zab,然後就沒問啦。

8 除了單例模式,知道適配器模式怎麼實現麼,有什麼用

9 回到網絡,剛才你說到直播場景,知道直播的架構怎麼設計麼,要點是什麼,說了幾個不太對,他說要避免廣播風暴,答不會。

10 Redis和MySQL有什麼區別,用於什麼場景。

11 問了一下最近看什麼書,什麼時候開始寫博客的

12 問了還有幾輪面試,他說這輪我可以過,有點小驚喜

四面:

三面過了半個多月,終於安排四面了。

1 自我介紹

2 項目,收穫

3 Linux瞭解哪些,基礎命令和知識。問我proc文件系統瞭解麼,答不瞭解。

4 TCP和UDP的核心區別在哪,講了滑動窗口保證可靠有序傳輸,UDP不可靠。TCP需要連接而UDP不需要。

5 TCP的四次揮手,time wait狀態有什麼意義。

6 說完這個他問我有什麼想問他的了。

7 我問他為什麼隔了這麼久才面試,而且之前三面都只是初試,然後他說最近他在休假,所以就。。。害我擔心了好久。他說接下來等HR面就行了。

HR面

1 自我介紹

2 實習收穫

3 臺灣交流體驗

4 之前實習公司的情況,拿到offer了嗎,會如何選擇呢

5 排一下公司,部門,薪資和城市等因素。

6 你的優缺點,如何改進

7 學生時代最成功的事

8 你的預期薪資

一面:

1 數據庫的事務,四個性質說一下,分別有什麼用,怎麼實現的。一致性沒講好。

2 講到了redo和undo日誌,問我分別有什麼用,說redo日誌說錯了。

3 數據庫的隔離性如何保證,使用悲觀鎖和樂觀鎖有何區別。MVCC的設計目的是什麼,怎麼使用版本號判斷數據的可見性。

4 問了一道算法,1到N的所有數字,按照字典序打印,怎麼做。

說了用數組排序,問複雜度,扯了半天。

怎麼優化,按照數字特徵順序打印,問這個東西和什麼結構比較像。提示是樹,然後說了個多叉樹,問我怎麼實現,最後其實使用dfs遍歷樹的每個分支。

5 多線程併發的同步實現,有兩個方法,每個方法裡有a部分代碼和b部分代碼,我要讓兩個線程分別執行兩個方法,並且讓他們運行完a部分代碼再一起向下執行,如何實現。

6 我說了用cyclicbarrier實現,互相等待await。

然後他問我怎麼用信號量實現,並且提示可以再用一個線程。

然後我說了個方案。

7 問了項目

8 如何把優化遞歸的代碼

改成尾遞歸或者循環。

面試官說不是,引導說用棧實現遞歸。

問我棧中需要壓入哪些數據。他說應該是方法參數,返回值,以及返回地址。

二面:

1 自我介紹,項目 10分鐘過去

2 服務器如何負載均衡,有哪些算法,哪個比較好,一致性哈希原理,怎麼避免DDOS攻擊請求打到少數機器。

3 TCP連接中的三次握手和四次揮手,四次揮手的最後一個ack的作用是什麼,為什麼要time wait,為什麼是2msl。

4 數據庫的備份和恢復怎麼實現的,主從複製怎麼做的,什麼時候會出現數據不一致,如何解決。

5 今天面試太多了,記不清了。。。

6 開源的技術看過用過麼,分佈式存儲的瞭解麼。

7 想做什麼方向的開發。

8 Linux查看cpu佔用率高的進程

9 查看佔用某端口的進程和某進程監聽的端口

10 如何查詢日誌文件中的所有ip,正則表達式

三面:

數據庫部門真的很嚴格,問題都挺難的。

1 講一下項目

2 平時瞭解什麼操作系統

Linux,說一下Linux排查問題常用的命令,ps,top,netstat,free,du等等

3 Linux的內存管理算法,問了一下是不是頁面置換算法,他說是。

說了lru和fifo,問我lru有什麼缺點,沒答上來。

4 Linux的文件系統瞭解麼,講了一下inode節點,文件和目錄的原理。他問我了不瞭解具體的文件系統ext2,ext3,答不會。。

5 進程通信方式有哪些,問我分別怎麼使用,管道有哪些類型,各有什麼優缺點。

6 問我服務器硬件瞭解麼。。一臉懵逼,問了我懂不懂Raid,瞎扯了幾句就說不懂了。

7 shell瞭解麼,沒怎麼寫過。

8 聽說你會Java,說一下JVM內存模型把,有哪些區,分別幹什麼的

9 說一下gc算法,分代回收說下。

10 設計模式瞭解麼,說了7種,問我分別怎麼用,實際應用過嗎,稍微扯了一下。

11 MySQL的引擎講一下,有什麼區別,使用場景呢。

12 查詢最新的10條數據,想了好一會,order by id desc limit 10

13 MySQL的union all和union有什麼區別,我瞎掰了一下,應該不對。

14 MySQL有哪幾種join方式,底層原理是什麼,答不會,只知道表現形式。

15 Redis瞭解哪些啊,數據結構和基本原理把。

問我Redis怎麼做集群,答了主從哨兵和cluster。

Redis的持久化怎麼做,aof和rdb,有什麼區別,有什麼優缺點。

16 Redis使用哨兵部署會有什麼問題,我說需要擴容的話還是得集群部署。

17 分佈式系統瞭解麼,說一下Hadoop瞭解啥。

我說基本組件稍微瞭解過,簡單搭過環境。

18 MapReduce的combiner幹啥的,我說是合併結果的,問我啥時候會用到,答不知道。

19 Hadoop分發任務時,有個job失敗了,hadoop會怎麼處理,我答不知道,猜是會繼續執行。。

20 hadoop分發任務,如果有一個節點特別慢拉慢了整體速度怎麼辦。我猜測是通過yarn分配相同的資源給每個任務,可以避免這種情況,他好像不太滿意。

21 hadoop答得很爛。問了我兩個10g文件比較,2g內存,重複率很高,篩選出不同的內容。我說拆成十份hash,每份兩兩比較hash的結果集,貌似他說OK。

22 排序算法瞭解哪些,巴拉巴拉。

23 用隊列計算一個樹的高度,我說用層次遍歷記錄節點高度。

24 一個黑名單集合,數據量很大,快速查詢一個值是否在集合裡,怎麼設計,我說布隆過濾器。

25 還是上一題,說這個黑名單可能需要動態地增刪改,如何設計才能避免訪問響應太慢。我沒思路,瞎扯了一下加硬件,用內存存,都被駁回了。然後他說算了。

26 上一題的黑名單做成分佈式,怎麼做。說了分片的方案,根據地址的hash值確定分片所在節點。

27 分佈式數據庫瞭解麼,我不太明白他問的是啥,說不了解,感覺應該是問數據庫的分佈式方案。

28 有什麼想問的,據他所說還有2-3輪面試,驚了。

全程50分鐘,可以說是迄今為止難度最大的一個?

一面:

1 項目

2 講一下AOP吧

3 動態代理和靜態代理有什麼區別

4 TCP和IP報文是否會分片,分別在什麼情況下會分片。

TCP分包之後是否還會進行ip分片

5 做個題

無限長軌道。兩輛車同方向開,車會滴水,怎麼讓他們相遇。這題簡直像腦筋急轉彎。

6 寫一個斐波那契數列

遞歸式,要求改進

dp方式,要求優化空間

用三個變量代替數組進行dp,要求改進

我說數學公式,OK。

7 講一下Linux的內存結構,我說只會JVM的,他讓我說一下。

兩者的內存如何映射,是什麼關係,不會。

8 沒了

二面

1 項目講一下,10多分鐘去了。

2 排序算法,複雜度,比較。快排的空間複雜度是logn

3 講一下OSI七層模型,我說了5層模型,然後他讓我再補充一下,問了每層的作用,問了wifi屬於哪一層。

4 線程間的同步用什麼方式,說了object方法。

問我使用hashmap時重寫哪兩個方法,為什麼要重寫,巴拉巴拉,什麼場景下重寫。

5 平時用過什麼數據結構,list用哪些有啥區別。

6 Spring中的ioc和aop。ioc的註解有哪些。

autowired和resource有什麼區別,作用域有哪些。

autowired如何配置兩個類中的一個嗎

7 寫一個單例模式,有點忘卻了,巴拉巴拉搞出一個雙重檢測的,中間改了多次。

8 Java會有內存洩漏嗎,三個區分別什麼情況下會產生內存洩漏

一面

1 項目

2 隊列和棧區別

3 兩個棧實現隊列,兩個棧實現最小值棧

4 數據庫的事務性質,如何實現這些性質

5 事務隔離級別有哪些,默認是什麼級別。

6 已提交讀有什麼問題,用於什麼場景

7 二叉樹瞭解麼,平衡二叉樹呢,有什麼場景會用到呢。

8 殭屍進程和孤兒進程是什麼,分別有什麼危害。

9 主從複製怎麼實現。

10 Redis你用來做什麼,為什麼不用mq做異步隊列

11 分佈式文件系統瞭解麼,HDFS講一下原理

12 Java中一般用什麼類型表示價格。

13 Java如何把byte類型轉換成字符串

14 Java的string類型為什麼是不可變的

15 有什麼問題

一面:

1 自我介紹

2 docker和k8s瞭解多少

3 研究生學了哪些課程

4 操作系統瞭解麼,講一下進程和線程

5 死鎖和處理方式

6 內存,虛擬內存和頁面置換

7 網絡瞭解麼,講一下三次握手和四次揮手

8 數據庫瞭解多少,mysql索引,事務,鎖講了一些

9 Redis呢,講了一下數據結構,持久化方式,使用場景

10 分佈式瞭解哪些,負載均衡有哪些方式,說了dns,nginx,lvs和硬件,一致性問題怎麼解決,說了2pc,3pc,raft和paxos,zab

10 mysql大表數據查詢,怎麼優化,分表,分庫。

11單鏈表判環

使用快慢指針解決

12 完全二叉樹判斷:

public boolean all(Node root) {
if(root == null) return false;
Queue<node> queue = new LinkedList<>();
queue.add(root);
int flag = 0;
while(queue.isEmpty()){
Node p = queue.pop();
if (p.left != null && flag == 0) {
queue.add(p.left);
}else if (flag == 1) {
return false;
}
else {
flag = 1;
}
if (p.right!= null && flag == 0) {
queue.add(p.right);
}else if (flag == 1) {
return false;
}else {
flag = 1;
}
}
return true;
}
/<node>

二面:

1 項目

2 docker和kubenetes的原理和了解程度

3 docker的cgroup瞭解麼

4 kubenetes的架構,擴容是怎麼完成的。

5 Java的四種引用

6 Java的線程通信方式

7 Linux的進程通信方式

8 Java的線程池

9 算法

1 - N + 1這些數中取出N個,問剩下的是哪個。。

我說加起來相減,面試官說取巧了,不能這樣。

我說比較數組下標,他還是說取巧。

於是我讓他提示我一下,他說了排序再找。。額

然後想了兩個空間換時間的辦法,一個是用hashmap遍歷兩個數組。一個是合併數組後統計數字出現次數,也是hashmap

10 給定一串數字,找出所有可能的IP地址組合,比如192168111,組合是192.168.1.11,192.168.11.1。

應該LeetCode的題。之前自己沒寫完整,現場憋出來了。

這個代碼應該沒錯。面試官看了二十分鐘才說ok。

然後我們就這樣沉默了20分鐘,中間他就說了幾句話。

public void ip (String s) {
List<string> list = new ArrayList<>();
List<list>> allList = new ArrayList<>();
dfs(s, 0, 0, list);
}
public void dfs(String str, int cur, int num, List<string> list) {
if (num == 4 && cur == str.length()) {
allList.add(new ArrayList(list));
return;
}
for (int i = cur;i < cur + 3 && i < str.length();i ++) {
String ss = str.substring(cur,i + 1);
if (legal(ss)) {
list.add(ss);
dfs(str,i + 1, num + 1, list);
list.removeAt(list.length() - 1);
}
}
}
public boolean legal(String s) {
if (s.charAt(0) == '0' && s.length != 1)return false;
if (Integer.parseInt(s) <= 255 && Integer.parseInt(s) >= 0) {
return true;
}
return false;
}
/<string>/<list>/<string>

網易雲音樂Java面經(共三面)

一面:

1 Java的集合類,hashmap如何處理衝突,除了使用紅黑樹和重寫hashcode外還有哪些方法。

2 Java的多線程的使用方法,用過哪些。

3 Java的單例模式寫一下,寫了枚舉類。

4 設計模式的幾個原則說一下

5 spring的單例模式是怎麼實現的。

6 類加載機制說一下,除了雙親委派,再說一下更具體的過程,什麼時候進行靜態變量的初始化。

7 mysql的索引講一下,一級和二級索引的區別,什麼時候可以不用查一級索引。答覆蓋索引。

8 MySQL的事務性質怎麼實現的,其中的持久性和隔離性說一下。隔離級別有哪些,解決哪些問題,默認級別是哪個,通過什麼實現的。

9 redis瞭解哪些數據結構,使用keys的話會有什麼問題,如何解決這個問題。

10 什麼時候會發生死鎖,有哪些必要條件,有哪些解決辦法。

11 http請求過程會發生什麼。

12 算法題,雲音樂的歌單列表,調整順序後需要保存到數據庫,如何讓每次保存的數據量最小,答使用數組標識該歌單是否有順序調整,最後只更新有發生變化的那些數據。

二面:

1 說一下你擅長的東西,博客裡寫了什麼東西。

2 Java的集合類,說一下hashmap都用到了啥。

3 Java的hashmap,頭插法和尾插法有什麼區別呢,會有什麼問題。

4 1.7和1.8有哪些區別,chm呢。aqs呢

5 多線程瞭解哪些,說一下閉鎖和屏障的用法和原理,寫一個多人賽跑的線程實例,同時出發並且記錄所用時間。

寫了半天,然後巴拉巴拉

6 說一下springboot,說一下他有什麼優點。並且他的註解是怎麼使用的,有哪些註解,其實我忘了。

Java的反射講一下,如何獲取重載方法和私有吵架。

7 springmvc中的內容講一下。disp。。說下,怎麼使用的,做了哪些事情,如何進行初始化的。我說了它兩個父類的作用,然後說了基本的轉發過程。

http協議有哪些內容,cookie是哪個字段,在文本中如何確定哪個是字段哪個是值。巴拉巴拉,問的很詳細。

8 web.xml怎麼使用的?有哪些組件,怎麼配置的。

9 servlet有哪些方法,init方法實在什麼時候執行的。

10 有哪些自己覺得比較好的地方說一下

巴拉巴拉了網絡編程,分佈式,大數據,雲計算。

11 Linux命令瞭解哪些說一下。

hr面:

1 自我介紹

2 實習經歷

3 實習收穫

4 評價一下雲音樂,和qq音樂比較一下。

5 有什麼愛好

6 城市選擇,公司選擇啥的

頭條後臺研發面經(共三面)

一面:

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。。瘋狂掉線搞得很蛋疼。

二面:

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 面試官說複雜度比較高,但是由於時間問題就說結束了。

三面:

三面的面試官真的高冷啊,不苟言笑就算了,我問他問他他都不愛搭理的,搞得我內心慌得一比,感覺涼涼。

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和hashmap可以。

於是我就寫了put和get函數,進行了隊頭隊尾操作。

他說get複雜度會不會太高,我瞎掰了半天沒找到辦法,他說那就這樣吧,今天面試到這。

11 媽蛋,過期淘汰的處理我還沒寫呢,你就說結束了,感覺涼了啊,我說我要不要把剩下邏輯下完,他說不用,心涼了一大截~

12 然後HR小姐姐讓我等結果了。溜了溜了

快手面經

一面:

1 寫一個選擇排序或者插入排序

2 寫一個生產者消費者

3 Java多線程瞭解麼,什麼時候一個int

類型的操作是不安全的,自加呢,賦值呢。

如果使用volatile修飾的話有什麼作用。

4 MySQL和redis的區別是什麼

5 為什麼MySQL和Redis都要使用獨立進程來部署,開放端口來提供服務,為什麼不寫在內核中。

6 有一個場景,多線程併發,為每個線程安排一個隨機的睡眠時間,設想一種數據結構去喚醒睡眠時間結束的線程,應該用哪種結構,答應該用優先級隊列,也就是小頂堆,頂部是剩餘睡眠時間最短的那個線程。

7 好像就是這些了。

二面:

1 項目

2 多線程

3 一道算法題,一個二維矩陣進行逆置操作,也就是行變列列變行。剛開始我理解錯了,直接用一維數組轉儲再重新填入新數組。

面試官說可以不用一維數組麼

然後解答的過程中才發現我理解錯了。改了一會才搞定。

4 擴展一下,二維數組存在500g的文件中,怎麼做才能完成上面算法的操作,我就說先按行拆分,最後再拼接。

5 擴展兩下,一行數據就會超出內存,應該怎麼做,那就按列拆分,最後合併。

6 知道服務的橫向擴展和縱向擴展麼,剛開始理解錯了,後來就說是提高單機性能,以及擴展成集群。

7 cap介紹一下吧,為什麼只能3選2

8 線程與進程

9 tcp和udp的區別

10 get和post的區別

11 併發量大概多少,做過優化嗎

拼多多(共三面)

一:先面了hr面

1 項目情況

2 實習收穫

3 老家和期望城市

4 對拼多多有什麼瞭解

5 對拼多多的11 10 6怎麼看,可以接受麼

二:技術面

1 講一下項目

2 做的主要是Java對吧,講一下多線程把,用到哪些寫一下

3 寫了thread和runnable,然後寫了線程池,她問我線程池由哪些組件組成,有哪些線程池,分別怎麼使用,以及拒絕策略有哪些。

4 什麼時候多線程會發生死鎖,寫一個例子吧,然後我寫了一個兩個線程,兩個鎖,分別持有一個,請求另一個的死鎖實例。

5 集合類熟悉吧,寫一個題目,一個字符串集合,找出pdd並且刪除,我直接寫了一個list然後for循環判斷相等時刪除,她說明顯問題,我才發現list直接刪位置會出錯,於是我說改用數組,她說不太符合要求,所以應該使用iterator刪除會好一點,修改會反映到集合類,並且不會出錯。

6 然後說一下Redis吧,是單線程還是多線程,Redis的分佈式怎麼做,說了集群。

7 RPC瞭解麼,我說了主要是協議棧+數據格式+序列化方式,然後需要有服務註冊中心管理生產者和消費者,他問我註冊中心宕機怎麼辦,我說可以做高可用,他說要問的不是這個,是想問我註冊中心宕機時消費者是否能訪問生產者。

我說消費者本地有緩存,可以訪問緩存中的生產者。

8 實習最大的收穫是什麼。

9 TCP三次握手的過程,如果沒有第三次握手有什麼問題。

三面:技術面

1 自我介紹

2 講一下項目的主要架構,你在裡面做了什麼

3 有什麼比較複雜的業務邏輯講一下。

4 最大的難點是什麼,收穫是什麼。

5 MySQL的主從複製怎麼做的,答日誌,具體原理是什麼,有什麼優缺點。

6 Redis瞭解哪些內容,是單線程麼,為什麼是單線程呢,數據一定是存在物理內存中麼,我不懂這話啥意思,就問了一下是不是指可能也在虛擬內存中。他說那講一下虛擬內存的機制把,我就講了分頁,頁表,換頁這些東西。

7 項目用到了多線程,如果線程數很多會怎麼樣,我說會佔內存,還有就是切換線程比較頻繁,他問切換線程會發生什麼,應該就是CPU切換上下文,具體就是寄存器和內存地址的刷新。

8 計算機如何訪問一個文件的字節流呢,講一下過程,說了Linux從inode節點找到磁盤地址,進行讀取,他問我是直接讀取麼,我就說還會有讀緩存,其實還應該說一下DMA的。

問了我知道swap分區麼,我說不太清楚。

9 分佈式瞭解哪些東西,消息隊列了解麼,用在什麼場景,說了削峰,限流和異步。說了kafka,問我怎麼保證數據不丟失,以及確保消息不會被重複消費。還問了消息送達確認是怎麼做的。

10 cap瞭解麼,分別指什麼,base呢,強一致性和弱一致性有什麼方法來做,2pc瞭解麼,說一下大概過程。

11 負載均衡怎麼做的呢,為什麼這麼做,瞭解過集群雪崩麼。

12 這樣一個題目,一個節點要和客戶連接建立心跳檢測,大概有百萬數量的連接,並且會定期發送心跳包,要寫一個update方法和check方法,update方法更新心跳狀態,check刪除超時節點,怎麼做,剛開始做了個hash發現check要輪詢太慢了,然後用計時器和開線程檢測也不行,最後說了個LRU,他說OK的。

13 寫一道題,二叉樹的後序遍歷,非遞歸算法。

用一個棧可以實現,先壓自己,再壓右節點,再壓左節點。不過我卡在一半沒寫完,面試官說有思路就行了,今天就面到這,然後就溜了,發現已經沒人了。

下面這些是我總結的對於一名3年工作經驗的Java程序員應該具備的技能,這可能是Java程序員們比較關心的內容。我這裡要說明一下,以下列舉的內容不是都要會的東西—-但是如果你掌握得越多,最終能得到的評價、拿到的薪水勢必也越高。

1、基本語法

這包括static、final、transient等關鍵字的作用,foreach循環的原理等等。今天面試我問你static關鍵字有哪些作 用,如果你答出static修飾變量、修飾方法我會認為你合格,答出靜態塊,我會認為你不錯,答出靜態內部類我會認為你很好,答出靜態導包我會對你很滿 意,因為能看出你非常熱衷研究技術。 最深入的一次,我記得面試官直接問到了我Volatile關 鍵字的底層實現原理(順便插一句,面試和被面試本身就是相對的,面試官能問這個問題同時也讓面試者感覺到面試官也是一個喜愛研究技術的人,增加了面試者對 公司的好感,我最終選擇的就是問了這個問題的公司),不要覺得這太吹毛求疵了—-越簡單的問題越能看出一個人的水平,別人對你技術的考量絕大多數都是以深度優先、廣度次之為標準的,切記。

2、集合

基本上就是List、Map、Set,問的是各種實現類的底層實現原理,實現類的優缺點。 集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、 HashSet的實現原理,能流利作答,當然能掌握CopyOnWrite容器和Queue是再好不過的了。另外多說一 句,ConcurrentHashMap的問題在面試中問得特別多,大概是因為這個類可以衍生出非常多的問題,關於ConcurrentHashMap, 我給網友朋友們提供三點回答或者是研究方向: (1)ConcurrentHashMap的鎖分段技術。 (2)ConcurrentHashMap的讀是否要加鎖,為什麼。 (3)ConcurrentHashMap的迭代器是強一致性的迭代器還是弱一致性的迭代器。

3、框架

老生常談,面試必問的東西。一般來說會問你一下你們項目中使用的框架,然後給你一些場景問你用框架怎麼做,比如我想要在Spring初始化bean 的時候做一些事情該怎麼做、想要在bean銷燬的時候做一些事情該怎麼做、MyBatis中$和#的區別等等,這些都比較實際了,平時積累得好、有多學習 框架的使用細節自然都不成問題。 如果上面你的問題答得好,面試官往往會深入地問一些框架的實現原理。問得最多的就是Spring AOP的實現原理,當然這個很簡單啦,兩句話就搞定的的事兒,即使你不會準備一下就好了。我遇到的最變態的是讓我畫一下Spring的Bean工廠實 現的UML圖,當然面對這樣一個有深度的問題,我是答不出來的

4、數據庫

數據庫十有八九也都會問到。一些基本的像和 all的區別、left join、幾種索引及其區別就不談了,比較重要的就是數據庫性能的優化,如果對於數據庫的性能優化一竅不通,那麼有時間,還是建議你在面試前花一兩天專門 把SQL基礎和SQL優化的內容準備一下。 不過數據庫倒是不用擔心,一家公司往往有很多部門,如果你對數據庫不熟悉而基本技術又非常好,九成都是會要你的,估計會先把你放到對數據庫使用不是要求非常高的部門鍛鍊一下。

5、Web方面的一些問題 Java主要面向Web端,因此Web的一些問題也是必問的。 我碰到過問得最多的兩個問題是: 談談分佈式Session的幾種實現方式。(大家可以聊下你們知道的實現方法) 常用的四種能答出來自然是讓面試官非常滿意的。 另外一個常問的問題是:講一下Session和Cookie的區別和聯繫以及Session的實現原理。這兩個問題之外,web.xml裡面的內容是重點,Filter、Servlet、Listener,不說對它們的實現原理一清二楚吧,至少能對它們的使用知根知底。另外,一些細節的方面比如get/post的區別、forward/重定向的區別、HTTPS的實現原理也都可能會被考察到。 Java初高級一起學習分享,共同學習才是最明智的選擇

6、數據結構和算法分析

數據結構和算法分析,對於一名程序員來說,會比不會好而且在工作中能派上用場。數組、鏈表是基礎,棧和隊列深入一些但也不難,樹挺重要的,比較 重要的樹AVL樹、紅黑樹,可以不瞭解它們的具體實現,但是要知道什麼是二叉查找樹、什麼是平衡樹,AVL樹和紅黑樹的區別。記得某次面試,某個面試官和 我聊到了數據庫的索引,他問我:你知道索引使用的是哪種數據結構實現嗎? 我答到用的Hash表吧,答錯。他又問,你知道為什麼要使用樹嗎?我答到因為Hash表可能會出現比較多的衝突,在千萬甚至是上億級別的數據面 前,會大大增加查找的時間複雜度。而樹比較穩定,基本保證最多二三十次就能找到想要的數據,對方說不完全對,最後我們還是交流了一下這個問題,我也明白了 為什麼要使用樹,這裡不說,網友朋友們覺得索引為什麼要使用樹來實現呢? 至於算法分析,不會、不想研究就算了,記得某次面試對方問我,Collections.sort方法使用的是哪種排序方法,額,吐血三升。當然為了 顯示我的博學,對算法分析也有一定的研究(⊙﹏⊙)b,我還是硬著頭皮說了一句可能是冒泡排序吧。當然答案肯定不是,有興趣的網友朋友們可以去看一下 Collections.sort方法的源代碼,用的是一種叫做TimSort的排序法,也就是增強型的歸併排序法。

7、Java虛擬機

出乎我的意料,Java虛擬機應該是很重要的一塊內容,結果在這幾家公司中被問到的概率幾乎為0。要知道,我去年可是花了大量的時間去研究Java虛擬機的,光周志明老師的《深入理解Java虛擬機:JVM高級特性與較佳實踐》,我就讀了不下五遍。 言歸正傳,雖然Java虛擬機沒問到,但我覺得還是有必要研究的,我就簡單地列一個提綱吧,談談Java虛擬機中比較重要的內容: (1)Java虛擬機的內存佈局 (2)GC算法及幾種垃圾收集器 (3)類加載機制,也就是雙親委派模型 (4)Java內存模型 (5)happens-before規則 (6)volatile關鍵字使用規則 也許面試無用,但在走向大牛的路上,不可不會。

8、設計模式

本來以為蠻重要的一塊內容,結果只在阿里巴巴B2B事業部面試的時候被問了一次,當時問的是裝飾器模式。 當然咱們不能這麼功利,為了面試而學習,設計模式在工作中還是非常重要、非常有用的,23種設計模式中重點研究常用的十來種就可以了,面試中關於設計模式的問答主要是三個方向: (1)你的項目中用到了哪些設計模式,如何使用。 (2)知道常用設計模式的優缺點。 (3)能畫出常用設計模式的UML圖。

9、多線程

這也是必問的一塊了。因為三年工作經驗,所以基本上不會再問你怎麼實現多線程了,會問得深入一些比如說Thread和Runnable的區別和聯 系、多次start一個線程會怎麼樣、線程有哪些狀態。當然這只是最基本的,出乎意料地,幾次面試幾乎都被同時問到了一個問題,問法不盡相同。 總結起來是 這麼一個意思: 假如有Thread1、Thread2、ThreaD3、Thread4四條線程分別統計C、D、E、F四個盤的大小,所有線程都統計完畢交給Thread5線程去做彙總,應當如何實現? 聰明的網友們對這個問題是否有答案呢?不難,java.util.concurrent下就有現成的類可以使用。(大家可以留言討論下用的什麼方法實現) 另外,線程池也是比較常問的一塊,常用的線程池有幾種?這幾種線程池之間有什麼區別和聯繫?線程池的實現原理是怎麼樣的?實際一些的,會給你一些具體的場景,讓你回答這種場景該使用什麼樣的線程池比較合適。 最後,雖然這次面試問得不多,但是多線程同步、鎖這塊也是重點。synchronized和ReentrantLock的區別、 synchronized鎖普通方法和鎖靜態方法、死鎖的原理及排查方法等等。

10、JDK源碼

要想拿高工資,JDK源碼不可不讀。上面的內容可能還和具體場景聯繫起來,JDK源碼就是實打實地看你平時是不是愛鑽研了。我面試過程中被問了不 少JDK源碼的問題,其中最刁鑽的一個問了我,String的hashCode()方法是怎麼實現的,幸好我平時String源代碼看得多,答了個大 概。 JDK源碼其實沒什麼好總結的,純粹看個人,總結一下比較重要的源碼: (1)List、Map、Set實現類的源代碼 (2)ReentrantLock、AQS的源代碼 (3)AtomicInteger的實現原理,主要能說清楚CAS機制並且AtomicInteger是如何利用CAS機制實現的 (4)線程池的實現原理 (5)Object類中的方法以及每個方法的作用 這些其實要求蠻高的,我去年一整年基本把JDK中重要類的源代碼研究了個遍,真的花費時間、花費精力,當然回頭看,是值得的—-不僅僅是為了應付面試。

最後,如果有興趣有時間,建議學習、研究一下SOA和RPC,面向服務體系,大型分佈式架構必備,救命良方、包治百病、屢試不爽

來一個總括的大綱吧!工作三年必修要掌握的技術有

是不是學習了上面做這些技術就夠了呢?相信看到這裡的碼友已經知道答案了,沒錯,你還需要知道分佈式架構的知識

那麼我們應該學習哪些源碼呢?那就要看哪些框架最常用了,希望下面的圖比較全。可關注我,私信回覆‘666’獲取原圖。

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

再者,你在這這個階段已經不能侷限於滿足於講代碼寫出來,此時此刻的你需要追求高質量高性能的代碼了,你此時需要研究的知識就會如下圖所示:

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

是不是學習了上面做這些技術就夠了呢?相信看到這裡的碼友已經知道答案了,沒錯,你還需要知道分佈式架構的知識

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

另外,目前企業有大小,平臺有限制,甚至對開放的方式方案都出現了獨立的方式,Facebook每個模塊的功能從設計到開發再到維護,由後端到前端再到客戶端都是通過一程序員來進行的,這些就是所謂的全棧工程師,那麼java開發中,我們服務器也有其自身的獨到性;那麼如何將龐大的後臺系統分部成為多個功能獨立,部署獨立,維護獨立,松耦合的獨立服務呢?從而減少企業的溝通成本和維護成本呢?毫無疑問,這就是微服務。

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

最後,如果說開發是一個戰場,那麼程序猿們就是勇猛的戰士,我們的戰鬥需要協調合作,統一調度,統一部署。那麼完美的配合自然需要優秀的開發工具,那就就是我們的團隊協作工具的學習。

團隊協作開發

Git

Maven

Jenkins

Sonar

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

如果不結合實戰,那麼說什麼都是空話,最後來看看B2C商城項目實戰。當你面對Hr的時候,是不是可以跟Ta說你有一個落地的大型互聯網B2C商城項目,你的商城項目是前後端分離的,用到了ZooKeep,Redis,Monggodb等等一些熱門的技術,這樣子是否會顯得更有逼格呢?

系統設計

用戶管理子系統

商品管理子系統

搜索子系統

訂單子系統

支付系統

分佈式調度系統

後臺系統

我的面經經驗分享(阿里、騰訊、百度、網易等),您get到了嗎?

關注我:私信回覆“架構資料”獲取往期Java高級架構資料、源碼、筆記、視頻

獲取以上架構資料


分享到:


相關文章: