天天看點

2021 阿裡巴巴和螞蟻金服 Java實習生 面試經驗貼(重要!!!)

最近面了螞蟻金服集團的Java實習生,遺憾的是在第三面的時候挂了,不過還是希望能在此部落格跟更多人分享我的經驗,跟大家一起成長!

由于論文未按照我原本的計劃投出去,備戰實習的時間被耽擱了,于是乎,從今年的3月份正式準備的Java研發工程師相關的工作!因為我目前在讀研二,很多人問我為什麼不選擇算法工程師,而且我讀研期間也是做的算法類(異質圖嵌入表示)相關工作,或者找資料挖掘,或者跟NLP相關的工作也行啊!的确,本人也經過再三的思考和相關實際工作的考量,最終還是覺得從事技術類研發工作可能更加适合我吧!

好啦,題歸正傳!我是3月1日開始準備的Java類相關工作,由于時間匆忙,我隻好一邊面試,一邊準備,導緻一開始被一些面試官怼得很慘!一開始準備Java我就投了阿裡巴巴集團,于是乎在3月8日收到了杭州阿裡巴巴的預面試,電話裡面是一個聲線溫柔的小哥哥,大緻就是想跟我約一個時間,由于我的履歷通過了阿裡系統的履歷篩選并且優秀的情況下,給了我預面試,意思就是說,如果我表現優秀,隻需要通過這一面就可以提前确定,不影響後續的正式面試!(不過,那時候我準備Java才8天,甚至連最起碼的悲觀鎖、樂觀鎖都答不上來!!!),于是還是硬着頭皮面試,當時大緻問了這些我問題:

請問java中記憶體洩漏是什麼意思?什麼場景下會出現記憶體洩漏的情況?

1. 談談對HashMap的了解,以及HashMap的底層實作原理?

2. 請問HashMap線程安全嗎?conCurrentHashMap是如何解決線程安全問題的?

3. 請問看過JDK的源碼嗎?對JDK有些什麼了解?

4. 請問一下類加載的順序和過程?

5. synchronized和volilate關鍵字的作用?對同步代碼塊有什麼了解?

6. 請談談對樂觀鎖和悲觀鎖的了解,他們的應用場景,和具體的實作方式?

7. 請問你對線程池了解多少?

8. 請問你對設計模式有沒有了解?單例模式有幾種實作方式?如何實作的?

9. 請問你都學過那些資料庫知識?MySQL的索引機制請講一下

10. 請談一談線性表和連結清單的優缺點

11. 請簡述紅黑樹的基本原理和代碼實作

12. 請簡述一下快速排序的基本過程和思想

13. TCP/IP模型(4層模型簡述)

14. 請簡述TCP3次握手和3次揮手的基本過程,為什麼不能2次握手?

15. TCP是一個全雙工的工程,請簡述原理

16. 請問對Redis有些什麼了解,是否了解Reids的記憶體回收機制

17. Java有哪些并發手段,請簡述一下

18. 線程數達到線程池的上限,有哪些政策來處理

19. 設計模式

20. 線程池的常用參數

21. 記憶體可見性、有序性、原子性

22. GC的機制

23. 導緻Full GC的幾種情況

24. JVM記憶體調優

25. Java記憶體模型

26. 接口預設方法的作用

27. HashCode一樣,equal不一樣怎麼辦?

28. 分布式鎖怎麼實作?

29. 最左字首比對

30. Tree索引和Hash索引的差別

31. 為什麼并發操作會導緻hashmap死循環?

32. http和tcp的差別?

33. 請簡述什麼是記憶體溢出?

34. CAS實作原理?

35. 平衡二叉樹

36. MySQL的存儲引擎

當然,由于表現得不好,就沒有後續了.........

于是,後面接着面了成都的螞蟻金服,通過了前兩輪面試之後才得知重慶這面也有螞蟻金服公司,于是将成都的螞蟻金服轉到了重慶螞蟻金服進行面試!

螞蟻金服第一面:

1. 淺談科研項目以及自己以前做過的項目

2. HashMap的初始長度為什麼是16?

經驗值,既然一定要設定一個預設的2^n 作為初始值,那麼就需要在效率和記憶體使用上做一個權衡。這個值既不能太小,也不能太大,太小了就有可能頻繁發生擴容,影響效率。太大了又浪費空間,不劃算。

3. 紅黑樹為什麼快,請簡述一下原因

紅黑樹能夠以O(log2(N))的時間複雜度進行搜尋、插入、删除操作。此外,任何不平衡都會在3次旋轉之内解決。而且實際應用中,很多語言都實作了紅黑樹的資料結構。比如 TreeMap, TreeSet(Java )、 STL(C++)等。

4. “Segment”分段鎖中每個Segment中如果叫你來設計,你會怎麼設計?

5. GC 算法

6. GC是如何進行清理的?

7. OSI模型和TCP/IP模型

8. Http和TCP之間的差別?以及HTTP為什麼要基于TCP來做而不是基于其他協定來做

TCP是傳輸控制協定,HTTP是資料傳輸協定,HTTP是基于TCP來做的;

http協定隻定義了應用層的東西,下層的可靠性要傳輸層來保證,但是沒有說一定要用tcp,隻要是可以保證可靠性傳輸層協定都可以承載http,比如有基于sctp的http實作。 http也不是不能通過udp承載,在手機上就有人自己開發基于reliable udp的http協定,不過都是非标準的。

9. TCP三向交握過程?為什麼不是2次?為什麼不是4次?

這裡就引出了 TCP 與 UDP 的一個基本差別, TCP 是可靠通信協定, 而 UDP 是不可靠通信協定。

  • TCP 的可靠性含義: 接收方收到的資料是完整, 有序, 無差錯的。
  • UDP 不可靠性含義: 接收方接收到的資料可能存在部分丢失, 順序也不一定能保證

首先,我們要知道TCP是全雙工的,即用戶端在給伺服器端發送資訊的同時,伺服器端也可以給用戶端發送資訊。如果兩次,那麼B無法确定B的資訊A是否能收到,是以如果B先說話,可能後面的A都收不到,會出現問題 。

  如果四次,那麼就造成了浪費,因為在三次結束之後,就已經可以保證A可以給B發資訊,A可以收到B的資訊; B可以給A發資訊,B可以收到A的資訊。

螞蟻金服第二面:

當時主要問了MySQL,由于太匆忙,沒有記下太多,就隻想起了這兩個問題

1. MySQL索引原理是什麼?

(1)索引的本質:一種排好序的資料結構;

(2)Hash 索引:單條記錄查詢的效率很高,時間複雜度為O(1),但是我們常用的Mysql Innodb引擎就不支援hash索引,Hash索引适合精确查找,但是範圍查找不适合;

(3)B+樹索引:MySQL中最常用的索引的資料結構是 B+ 樹

2. MySQL為什麼查詢速度快其實就是問B+樹為什麼查詢速度快?

(1)B+ 樹的層級更少:相較于 B 樹,B+樹每個非葉子節點存儲的關鍵字數更多,樹的層級更少,是以查詢資料更快;

(2)B+ 樹查詢速度更穩定:B+ 所有關鍵字資料位址都存在葉子節點上,是以每次查找的次數都相同是以查詢速度要比B樹更穩定;

(3)B+ 樹天然具備排序功能:B+ 樹所有的葉子節點資料構成了一個有序連結清單,在查詢大小區間的資料時候更友善,資料緊密性很高,緩存的命中率也會比B樹高;

(4)B+ 樹全節點周遊更快:B+ 樹周遊整棵樹隻需要周遊所有的葉子節點即可,而不需要像 B 樹一樣需要對每一層進行周遊,這有利于資料庫做全表掃描;

1. 此時此刻,如何知道重慶上方有多少架飛機?

2. 如何預測未來1個小時,重慶上方有多少架飛機飛過?

3. Hashcode()方法和equils()方法的差別?

4. ==和equils()方法的差別?

5. i和j都是Number類型的對象,現在i=7, j=7,請問 i==j 會傳回什麼結果?為什麼?

6. 請問HashMap和HashTable的差別是什麼?

7. 請問Java中有哪些集合,集合中哪些是線程安全的?

8. 簡單談一談連結清單

9. 大概講一講你學到的一些排序方法和其對應的時間複雜度

10. 請問資料庫中事物的隔離級别有哪些?分别介紹一下

11. 分布式鎖

最後在螞蟻的第三面挂了,是因為沒有答出hashcode具體的計算方法,以及ArrayList擴容原理,還有如何重寫hashcode方法和equals方法(以上問題都是基礎問題,希望大家在準備的過程中一定要注重基礎的學習,不要像我一樣,這些基礎的問題沒有回答上來被挂掉實在可惜!!)