一次真實的螞蟻金服的面試經歷!進入名企沒那麼難

一次真實的螞蟻金服的面試經歷!進入名企沒那麼難



題外話: 有時間衝突的時候及時跟面試官溝通,往往第一面是技術面,大家都是做技術的,能理解的。 平時多交點朋友往往會有意外的驚喜

流程

1、2分鐘的自我介紹

大致講了下自己的姓名,畢業院校,哪年畢業,個人愛好以及平時空閒時間做點什麼,這個如實回答就好。因為之前有面試過,所以準備過。建議可以自己提前寫下來,多說幾遍,找點感覺。

2、你自己認為自己最熟悉的技術是什麼?

這個就因人而異了,每個人熟悉的東西都不一樣,一定要說自己最擅長的東西,不要給自己挖坑。因為面試官下一步就會根據你的回答進行提問。對於我來是,工作了幾年學的東西多而雜,沒有什麼很深入的,但是總不能說沒有吧,所以就說了 Java 開發比較多,所以 Java 語言熟悉多一點。然後面試官就說:“好,那我就問你一點 Java 語言方面的。

3、 HashMap 底層實現原理是什麼?

這個作為一個面試必問的題目,所以我還是提前準備過的,看過源碼。所以這個問題不是問題,答完,面試官說回答的對了。

HashMap,HashTable,ConcurrentHashMap 面試必備,針對1.7和1.8的不同實現加以說明。包括底層的數據結構,Hash 碰撞生成鏈表,Java8的鏈表轉紅黑樹。

4、Java 的多線程有沒有使用過

根據自身情況,用過就用過,沒用過就沒有用過。我回答有簡單的使用過,但是使用的場景不多。面試官也就沒追問了,說了沒關係,就繼續。

5、講一下線程池,以及實現固定大小線程池底層是如何實現的?

講了下四中線程池,單一線程池,固定大小線程池,緩存線程池,定時線程池。但是關於固定大小線程池底層是如何實現的,回答的不好,面試官直接問底層的源碼是不是沒看過,就說是的。面試官說沒關係。。。

追加:線程池底層都是通過ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)來實現的。corePoolSize: 表示需要設置的線程個數; maximumPoolSize: 線程池允許的最大線程個數; keepAliveTime: 空閒線程存活的時間,超過這個時間就會被回收; unit: 存活時間的單位;workQueue: 需要執行的任務隊列。threadFactory: 線程工廠,用於創建線程,一般用默認的即可; handler: 拒絕策略,當任務太多來不及處理,如何拒絕任務; 拒絕策略: 直接丟棄(DiscardPolicy) 丟棄隊列中最老的任務(DiscardOldestPolicy) 拋異常(AbortPolicy) 將任務分給調用線程來執行(CallerRunsPolicy)

6、Redis 為什麼這麼高效,使用的場景是什麼?

回答了一下我們使用 redis 做緩存和登錄 session 存在的場景,以及 redis 是單線程的。

1、完全基於內存,大多數請求都是內存操作,非常快速; 2、數據結構簡單,操作簡單; 3、採用單線程,避免了不必要的上下文切換和競爭條件,不存在多進程或者多線程的切換,不用考慮鎖帶來的性能消耗; 4、使用多路 I/O複用模型,非阻塞 IO

7、分佈式服務是否瞭解,zookeeper,dubbo 是否使用過?

關於 zk 和 dubbo 這塊用的不多,zk 主要是在使用 kafka 的時候會用到,但是不涉及原理上面的研究。dubbo 雖然項目中有用過,但是並不是很深入,就沒說用過,直接說沒用過。

8、冪等概念有沒有了解過

冪等性是數學上的含義是對於參數 x,f(x)=f(f(x));比如絕對值函數。 在分佈式環境下表示的是對於同樣的請求,在一次或者多次請求的情況下對系統的使用資源是一樣的。保證失敗重試不會導致提交兩次。 方法: 帶版本號的方式; 採用數據庫唯一索引方式;

9、常用的數據庫是什麼?

我們常用的數據庫是 MySQL,所以就回答了 MySQL。

10、MySQL 的事務特性有哪些?

•首先事務是作為單個邏輯工作單元執行的一系列操作,這些操作作為一個整體一起向系統提交,要麼都執行,要麼都不執行。事務是一個不可分割的邏輯單元。

•A(原子性)事務的各步操作是不可分的,保證一系列的操作要麼都完成,要麼都不完成;

•C(一致性)事務完成,數據必須處於一致的狀態;

•I(隔離性)對數據進行修改的所有併發事務彼此之間是相互隔離,這表明事務必須是獨立的,不應以任何方式依賴或影響其他事務;

•D(持久性)表示事務對數據處理結束後,對數據更改必須持久化,不管是事務成功還是回滾。事務日誌都能夠保持事務的永久性。

11、如果現在一臺生產的數據庫掛了怎麼處理?

首先這題沒有 get 的面試官想問的點是什麼,所以就根據自己項目本身的情況做答了。我們項目生產上的數據庫是有主備的,在主數據庫掛掉的情況下是會切換到備數據庫,先保證業務的穩定性,然後在對崩潰現場進行保留,方便後續分析問題,找到原因。這裡面試官追問了一下,我們主備的切換是自動的還是手動的,這個由於是公司運維團隊負責的,自己本身不是特別清楚,但是根據對公司運維團隊的瞭解,應該是自動的。所以就這樣如實的回答了。

12、數據庫如何實現 rollback 的?

數據庫在寫入數據之前是先講對數據的改動寫入 redo log 和 undo log,然後在操作數據,如果成功提交事務就會講操作寫入磁盤;如果失敗就會根據redo log 和 undo log 逆向還原到事務操作之前的狀態。

13、工作這麼久你遇到的最難的技術點是什麼?

我這邊根據具體的工具經理,回答的是 kafka 的初次使用,因為當時是公司內部第一個引入 kafka,之前沒有小組使用過,所以要採很多坑。並且那個時候 kafka 還沒有發佈1.0版本,官網和網上提供的版本很雜亂不兼容。

14、用過Kafka 的話說下 Kafka優缺點有哪些?

•Kafka 是一個高吞吐量的消息隊列。基本的組件有生產者,消費者,node 節點,生產者負責生產消息,將消息發送到指定的 topic 或者 partition 當中。

•每個 partition 可以有多個分區副本,並且存放在不同的 broker 節點上,保證數據的安全。partiton 的底層是根據 segment 段存放的一系列日誌文件,文件裡面存放的具體的消息內容,每條消息都有一個唯一的 offset 偏移量,並且是按照磁盤順序存放的。由於磁盤是順序讀寫,所以 kafka 可以有很高的吞吐量。磁盤的順序讀寫比隨機讀寫的性能高很多。

•每個消費者都屬於一個消費者組,可以消費指定 topic 下的數據。

15、TCP/IP 協議是如何保證數據可靠性的?

首先 TCP是面向連接的傳輸協議。主要通過消息確認和重試機制來保證數據傳輸的可靠性。

電面二

二面的時間是在第二週,週四下午的時候打電話過來,問是否可以面試。但是當時在上班就說不方便,能否週五晚上面試。面試官說可以。誰知道,第二天中午還沒下班就打電話過來說面試,可能本來週五大家各自事情都多吧,他也想盡快搞完。我這邊被突然的面試電話給搞懵了一下,想著不是約好了晚上麼,怎麼搞突擊。。。但是沒辦法,已經推過一次,沒好意思再推掉。就說了我要找個安靜地方,稍等下。

整個面試過程不是很好,主要是在公司內部找了個沒人的地方,說話聲音都不敢大,而且還經常有人經過,來來回回的。感覺這點沒有決策好,也是這次的一個遺憾。所以大家電話面試的時候一定要找個沒人的地方。

流程

1、先進行自我介紹,然後介紹自己做過的項目,從項目流程架構設計等方面介紹

根據個人經歷說了自己所做的項目,以及流程和架構方面,因為是自己參與的項目,所以整個流程說的還是很流暢的。畢竟自己很熟悉。這塊儘量多從幾個方面講,流程,架構,設計等。

2、HashMap 的查詢時間複雜度

理想情況下是 O(1)的,但是實際中會出現 hash 碰撞,導致無法達到效果。

3、LinkedList和ArrayList的區別

•LinkedList 底層是基於雙向鏈表實現的,而 ArrayList 底層是基於動態數組實現的;

•查詢的時候 LinkedList 的效率要低於 ArrayList,因為 LinkedList 需要遍歷鏈表,而 ArrayList 底層數組根據下標直接獲取數據。

•插入刪除數據的時候,LinkedList 效率比ArrayList 效率高,因為 ArrayList 在數據多的情況下會進行數組擴容或移動數組。

3 4、多進程與多線程在編程上面有什麼需要注意的

首先進程是資源分配的最小單元,線程是任務調度的最小單元

對比維度

多進程

多線程

總結

數據共享、同步

數據共享複雜,需要用IPC;數據是分開的,同步簡單

因為共享進程數據,數據共享簡單,但也是因為這個原因導致同步複雜

各有優勢

內存、CPU

佔用內存多,切換複雜,CPU利用率低

佔用內存少,切換簡單,CPU利用率高

線程佔優

創建銷燬、切換

創建銷燬、切換複雜,速度慢

創建銷燬、切換簡單,速度很快

線程佔優

編程、調試

編程簡單,調試簡單

編程複雜,調試複雜

進程佔優

可靠性

進程間不會互相影響

一個線程掛掉將導致整個進程掛掉

進程佔優

分佈式

適應於多核、多機分佈式;如果一臺機器不夠,擴展到多臺機器比較簡單

適應於多核分佈式

進程佔優

5、ThreadLocal的使用場景

ThreadLocal 適用於每個線程需要自己獨立的實例且該實例需要在多個方法中被使用,也即變量在線程間隔離而在方法或類間共享的場景。

6、堆內存和棧內存有什麼區別

•堆內存是線程共享的,棧內存是線程私有的;

•堆內存用來存放由new創建的對象和數組,棧內存中存放一些基本類型的變量和對象的引用變量;

7、堆排序時間複雜度

排序名稱

穩定性

平均時間複雜度

最好時間複雜度

最壞時間複雜度

桶排序

不穩定

O(n)

O(n)

O(n)

基數排序

穩定

O(n)

O(n)

O(n)

歸併排序

穩定

O(nlogn)

O(nlogn)

O(nlogn)

快速排序

不穩定

O(nlogn)

O(nlogn)

O(n^2)

堆排序

不穩定

O(nlogn)

O(nlogn)

O(nlogn)

冒泡排序

穩定

O(n^2)

O(n)

O(n^2)

選擇排序

不穩定

O(n^2)

O(n^2)

O(n^2)

8、如果優化數據庫的數據查詢,另外應用層上還能如何優化?

1)數據庫層面上:

•除了主鍵索引,唯一索引之外,對於常用的查詢字段也要加索引。查詢的時候儘量使用主鍵索引,因為MySQL 的 InnoDB 的主鍵索引索引的是整行數據,而普通索引索引的是主鍵,會有回表操作。當然索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,需要酌情考慮。 2、優化查詢語句,儘量採用確認性查詢語句,減少 or,in,not in,%xxx%語法的使用。

2)應用層面上:

•採用緩存機制,將常用的數據進行緩存,增加訪問速度;

•分庫分表,讀寫分離,將數據分開讀寫,提升性能

9、強一致性,弱一致性,最終一致性

•強一致性:對於更新後的數據,要求後續所有節點的任何操作都要獲取最新值的情況;

•弱一致性:對於更新後的數據,後續節點的數據操作可以是新值,也可以是舊值,通過一段時間後後續節點對數據的操作都是新值;

•最終一致性:是弱一致性的特殊形式,存儲系統保證在沒有新的更新的條件下,最終所有的訪問都是最後更新的值。

10、有一個一百萬行的文件,內部是購買的商品ID,如何獲取到購買最多的前一百個商品。

•思路:首先考察的肯定是大數據處理方案,這些數據肯定不能一次性讀取到內存,那就需要拆分,將數據分隔處理。假設要分隔為 n 個文件。

•分隔:如果 ID 是整型的話,可以直接採用取模(id % n)的方式;如果 ID 是字符串可以先計算 hash 值然後再取模(hash(x) % n)的方式,將相同 ID 的商品分到同一個文件中。

•針對每個小文件進行 top100的排序,返回購買最多的100個商品 ID

•根據 n 個文件中的100個 ID,在進行一次排序,即可得到需要的數據。

小結都是從業這個行業的,我做這行十多年,如果大家對於學習Java有任何問題。比如如何提升技術、學習方法應該注意什麼、以及如何才能提升薪資或者缺少比較新的Java學習資料,都可以隨時來諮詢我,私信我“Java”會自動回覆我建立的Java技術顧問交流學習群,希望大家可以多交流,找到屬於自己的圈子。

相關推薦

推薦中...