最近一位筆者經歷了漫長一個月的等待,終于在前幾天通過面試官獲悉已被螞蟻金服錄取,這期間的焦慮、痛苦自不必說,知道被錄取的那一刻,一整年的陰霾都一掃而空了,
筆者面的是阿里的Java研發工程師崗,面試流程是3輪技術面+1輪hr面,
意外的一面
一面的時候大概是3月12號,面完等了差不多半個月才突然接到二面面試官的電話,一面可能是簡歷面,所以問題比較簡單,
ArrayList和LinkedList區別
- ArrayList 是一個可改變大小的陣列,當更多的元素加入到ArrayList中時,其大小將會動態地增長,內部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質上就是一個陣列,
- LinkedList 是一個雙鏈表,在添加和洗掉元素時具有比ArrayList更好的性能.但在get與set方面弱于ArrayList,
當然,這些對比都是指資料量很大或者操作很頻繁的情況下的對比,如果資料和運算量很小,那么對比將失去意義,
什么情況會造成記憶體泄漏
在Java中,記憶體泄漏就是存在一些被分配的物件,這些物件有下面兩個特點:
首先,這些物件是可達的,即在有向圖中,存在通路可以與其相連;
其次,這些物件是無用的,即程式以后不會再使用這些物件,
如果物件滿足這兩個條件,這些物件就可以判定為Java中的記憶體泄漏,這些物件不會被GC所回收,然而它卻占用記憶體,
什么是執行緒死鎖,如何解決
產生死鎖的條件有四個:
- 互斥條件:所謂互斥就是行程在某一時間內獨占資源,
- 請求與保持條件:一個行程因請求資源而阻塞時,對已獲得的資源保持不放,
- 不剝奪條件:行程已獲得資源,在末使用完之前,不能強行剝奪,
- 回圈等待條件:若干行程之間形成一種頭尾相接的回圈等待資源關系,
執行緒死鎖是因為多執行緒訪問共享資源,由于訪問的順序不當所造成的,通常是一個執行緒鎖定了一個資源A,而又想去鎖定資源B;在另一個執行緒中,鎖定了資源B,而又想去鎖定資源A以完成自身的操作,兩個執行緒都想得到對方的資源,而不愿釋放自己的資源,造成兩個執行緒都在等待,而無法執行的情況,
要解決死鎖,可以從死鎖的四個條件出發,只要破壞了一個必要條件,那么我們的死鎖就解決了,在java中使用多執行緒的時候一定要考慮是否有死鎖的問題哦,
紅黑樹是什么?怎么實作?時間復雜度
紅黑樹(Red-Black Tree,簡稱R-B Tree),它一種特殊的二叉查找樹,紅黑樹是特殊的二叉查找樹,意味著它滿足二叉查找樹的特征:任意一個節點所包含的鍵值,大于等于左孩子的鍵值,小于等于右孩子的鍵值,除了具備該特性之外,紅黑樹還包括許多額外的資訊,
紅黑樹的每個節點上都有存盤位表示節點的顏色,顏色是紅(Red)或黑(Black),紅黑樹的特性:
- 每個節點或者是黑色,或者是紅色,
- 根節點是黑色,
- 每個葉子節點是黑色,
- 如果一個節點是紅色的,則它的子節點必須是黑色的,
- 從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點,
關于它的特性,需要注意的是:
第一,特性(3)中的葉子節點,是只為空(NIL或null)的節點,
第二,特性(5),確保沒有一條路徑會比其他路徑長出倆倍,因而,紅黑樹是相對是接近平衡的二叉樹,
文末領取面試資料
具體實作代碼這里不貼了,要實作起來,需要包含的基本操作是添加、洗掉和旋轉,在對紅黑樹進行添加或洗掉后,會用到旋轉方法,旋轉的目的是讓樹保持紅黑樹的特性,旋轉包括兩種:左旋 和 右旋,
紅黑樹的應用比較廣泛,主要是用它來存盤有序的資料,它的查找、插入和洗掉操作的時間復雜度是O(lgn),
TCP三次握手
三次握手(three times handshake;three-way handshake)所謂的“三次握手”即對每次發送的資料量是怎樣跟蹤進行協商使資料段的發送和接收同步,根據所接收到的資料量而確定的資料確認數及資料發送、接收完畢后何時撤消聯系,并建立虛連接,
為了提供可靠的傳送,TCP在發送新的資料之前,以特定的順序將資料包的序號,并需要這些包傳送給目標機之后的確認訊息,TCP總是用來發送大批量的資料,當應用程式在收到資料后要做出確認時也要用到TCP,
文末領取面試資料
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers),
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手,
突然的二面
一面的時候大概是3月12號,面完等了差不多半個月才突然接到二面面試官的電話,
介紹專案
Storm怎么保證一致性
- Storm是一個分布式的流處理系統,利用anchor和ack機制保證所有tuple都被成功處理,如果tuple出錯,則可以被重傳,但是如何保證出錯的tuple只被處理一次呢?Storm提供了一套事務性組件Transaction Topology,用來解決這個問題,
- Transactional Topology目前已經不再維護,由Trident來實作事務性topology,但是原理相同,
說一下hashmap以及它是否執行緒安全
HashMap基于哈希表的 Map 介面的實作,HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null,HashMap中hash陣列的默認大小是16,而且一定是2的指數,Hashtable、HashMap都使用了 Iterator,而由于歷史原因,Hashtable還使用了Enumeration的方式 ,HashMap 實作 Iterator,支持fast-fail,
哈希表是由陣列+鏈表組成的,它是通過把key值進行hash來定位物件的,這樣可以提供比線性存盤更好的性能
文末領取面試資料
HashMap不是執行緒安全的,
十億條淘寶購買記錄,怎么獲取出現最多的前十個
這是一道典型的有限記憶體的海量資料處理的題目,一般這類題目的解答無非是以下幾種:
- 分治,hash映射,堆排序,雙層桶劃分,Bloom Filter,bitmap,資料庫索引,mapreduce等,
- 具體情形都有很多不同的方案,這類題目可以到網上搜索一下,了解下套路,后面就基本都會了,
平時有沒有用linux系統,怎么查看某個行程
ps aux|grep java 查看java行程ps aux 查看所有行程ps –ef|grep tomcat 查看所有有關tomcat的行程ps -ef|grep --color java 高亮要查詢的關鍵字kill -9 19979 終止執行緒號位19979的行程
說一下Innodb和MySIAM的區別
- MyISAM型別不支持事務處理等高級處理,而InnoDB型別支持,MyISAM型別的表強調的是性能,其執行數度比InnoDB型別更快,但是不提供事務支持,而InnoDB提供事務支持以及外部鍵等高級資料庫功能,
- InnoDB不支持FULLTEXT型別的索引,
- InnoDB 中不保存表的具體行數,也就是說,執行select count() from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可,注意的是,當count()陳述句包含 where條件時,兩種表的操作是一樣的,
- 對于AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引,
- DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的洗掉,
- LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用,
說一下jvm記憶體模型,介紹一下你了解的垃圾收集器
其實并沒有jvm記憶體模型的概念,應該是Java記憶體模型或者jvm記憶體結構,這里面試者一定要聽清楚問的是哪個,再回答,
你說你是大資料方向的,了解哪些大資料框架
作者回答了一些zookeeper、storm、HDFS、Hbase等
其他問題
- 100個有序的整型,如何打亂順序?
- 如何設計一個可靠的UDP協議?
二面大概就是這些,其中storm一致性這個問題被面試官懷疑了一下,就有點緊張,其實沒答錯,所以還是要對知識掌握得更明確才行,
準備充足的三面
清明節的時候例外地沒有回家掃墓,因為知道自己的弱項是作業系統和海量資料題這塊,所以想著惡補這方面的知識,不過之后的面試意外的并沒有問到這方面的內容,
- 介紹專案:專案介紹完之后沒問太多
- 介紹一下hashmap:HashMap真的是面試高頻題,多次面試都問到了,一定要掌握,
- 介紹一下并發:這里可以把整個并發的體系都說下,包括volatile、synchronized、lock、樂觀悲觀鎖、鎖膨脹、鎖降級、執行緒池等
- 銀行賬戶讀寫怎么做:我說了讀寫鎖以及可能出現死鎖問題
說一下關系型資料庫和非關系型資料庫的區別
非關系型資料庫的優勢:
- 性能:NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL層的決議,所以性能非常高
- 可擴展性:同樣也是因為基于鍵值對,資料之間沒有耦合性,所以非常容易水平擴展,
使用場景:日志、埋點、論壇、博客等
關系型資料庫的優勢:
- 復雜查詢:可以用SQL陳述句方便的在一個表以及多個表之間做非常復雜的資料查詢
- 事務支持:使得對于安全性能很高的資料訪問要求得以實作,
使用場景:所有有邏輯關系的資料存盤
如何訪問鏈表中間節點
對于這個問題,我們首先能夠想到的就是先遍歷一遍整個的鏈表,然后計算出鏈表的長度,進而遍歷第二遍找出中間位置的資料,這種方式非常簡單,
若題目要求只能遍歷一次鏈表,那又當如何解決問題?
可以采取建立兩個指標,一個指標一次遍歷兩個節點,另一個節點一次遍歷一個節點,當快指標遍歷到空節點時,慢指標指向的位置為鏈表的中間位置,這種解決問題的方法稱為快慢指標方法,
說下行程間通信,以及各自的區別
行程間通信是指在不同行程之間傳播或交換資訊,方式通常有管道(包括無名管道和命名管道)、訊息佇列、信號量、共享存盤、Socket、Streams等,
焦慮的hr面
之所以說hr面焦慮,是因為面試前我還在看IG的半決賽(實在復習不下),接到電話的時候分外緊張,在一些點上答得很差,
遇到什么挫折:這種問題主要考察面試者遇見困難是否能堅持下去,并且可以看出他的解決問題的能力,
可以簡單描述挫折,并說明自己如何克服,最終有哪些識訓,
職業規劃:表明自己決心,首先自己不準備繼續求學了,必須招作業了,然后說下自己不會短期內換行業,或者換作業,自己比較喜歡,希望可以堅持幾年看自己的興趣再規劃之類的,
對阿里的認識:這個比較簡答,夸就行了,
有什么崇拜的人嗎:我說了詹姆斯哈登,hr小姐姐居然笑了,這個可以說一些IT大牛,
希望去哪里就業:這個問題果斷回答該公司所在的城市啊,
其他問題:有什么興趣愛好,能拿得上臺表演的有嗎
總結
提前批更多的是考察基礎知識,大公司都有自己在用的框架,你進去后基本上得重新學這些框架,所以對他們來說,基礎是否扎實才是考察的關鍵,
基礎包括:作業系統、linxu、資料庫、資料結構、演算法、java(基礎、容器、高并發、jvm)、計算機網路等
當時我問一個java群的師兄,學不下了怎么辦,他說,換種姿勢繼續學.......
面試建議是,一定要自信,敢于表達,面試的時候我們對知識的掌握有時候很難面面俱到,把自己的思路說出來,而不是直接告訴面試官自己不懂,這也是可以加分的,
最后
總之,可以拿到螞蟻金服的offer真的很意外,也很幸運,螞蟻金服從來是我覺得很難達到的目標,但它確實發生了,也許這就是幸福來敲門吧,我可以給到自己或其他人的建議就是,一定要把握好時機,我有整理自己面試寶典需要的也可以免費領取!
掃描下方二維碼即可

Don't ever let somebody tell you you can't do something, not even me. You got a dream, you gotta protect it. People can't do something by themselves,they wanna tell you you can not do it. If You want something. Go get it!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47246.html
標籤:Java
上一篇:Spring 的Controller 是單例or多例
下一篇:git常用命令
