2019螞蟻金服Java必問面試題(二面)

2019螞蟻金服Java必問面試題(二面)
二面css

你有什麼問題想問個人嗎?html

一、自我介紹、工做經歷、技術棧前端

二、項目中你學到了什麼技術?java

三、微服務劃分的粒度?程序員

四、微服務的高可用怎麼保證的?web

負載均衡與反向代理,隔離,限流,降級,超時與重試,回滾,壓力測試與應急預案面試

五、經常使用的負載均衡,該怎麼用,你能說下嗎?算法

(1)http重定向sql

當http代理(好比瀏覽器)向web服務器請求某個URL後,web服務器能夠經過http響應頭信息中的Location標記來返回一個新的URL。這意味着HTTP代理須要繼續請求這個新的URL,完成自動跳轉。數據庫

(2)DNS負載均衡

DNS 負責提供域名解析服務,當訪問某個站點時,實際上首先須要經過該站點域名的DNS服務器來獲取域名指向的IP地址,在這一過程當中,DNS服務器完成了域名到IP地址的映射,一樣,這樣映射也能夠是一對多的,這時候,DNS服務器便充當了負載均衡調度器,它就像http重定向轉換策略同樣,將用戶的請求分散到多臺服務器上,可是它的實現機制徹底不一樣。

(3)IP負載均衡(LVS-NAT)

由於反向代理服務器工做在HTTP層,其自己的開銷就已經嚴重製約了可擴展性,從而也限制了它的性能極限。那可否在HTTP層面如下實現負載均衡呢?

NAT服務器:它工做在傳輸層,它能夠修改發送來的IP數據包,將數據包的目標地址修改成實際服務器地址

(4)直接路由(LVS-DR)

NAT是工做在網絡分層模型的傳輸層(第四層),而直接路由是工做在數據鏈路層(第二層),貌似更屌些。它經過修改數據包的目標MAC地址(沒有修改目標IP),將數據包轉發到實際服務器上,不一樣的是,實際服務器的響應數據包將直接發送給客戶羰,而不通過調度器

(5)IP隧道(LVS-TUN)

基於IP隧道的請求轉發機制:將調度器收到的IP數據包封裝在一個新的IP數據包中,轉交給實際服務器,而後實際服務器的響應數據包能夠直接到達用戶端。目前Linux大多支持,能夠用LVS來實現,稱爲LVS-TUN,與LVS-DR不一樣的是,實際服務器能夠和調度器不在同一個WANt網段,調度器經過 IP隧道技術來轉發請求到實際服務器,因此實際服務器也必須擁有合法的IP地址。

整體來講,LVS-DR和LVS-TUN都適合響應和請求不對稱的Web服務器,如何從它們中作出選擇,取決於你的網絡部署須要,由於LVS-TUN能夠將實際服務器根據須要部署在不一樣的地域,而且根據就近訪問的原則來轉移請求,因此有相似這種需求的,就應該選擇LVS-TUN。

六、網關可以爲後端服務帶來哪些好處?

後端服務器能夠專心處理業務請求,節省了大量鏈接管理的開銷

七、對象比較是否相同

equals一般用來比較兩個對象的內容是否相等,==用來比較兩個對象的地址是否相等

八、hashmap put 方法存放的時候怎麼判斷是不是重複的

先比較key的hashCode,再比較相等或equals的,因此重寫hashCode()和equals()方法便可實現添加劇復元素。

九、Set 和 List 區別?

Set(集):集合中的對象不按特定方式排序,而且沒有重複對象。它的有些實現類能對集合中的對象按特定方式排序。

List(列表):集合中的對象按索引位置排序,能夠有重複對象,容許按照對象在集合中的索引位置檢索對象。

十、ArrayList 和 LinkedList 區別

ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構

ArrayList 繼承AbstractList

LinkedList 繼承AbstractSequentialList

ArrayList 採用的是數組形式來保存對象的,這種方式將對象放在連續的位置中,因此最大的缺點就是插入刪除時很是麻煩

LinkedList 採用的將對象存放在獨立的空間中,並且在每一個空間中還保存下一個連接的索引 可是缺點就是查找很是麻煩 要叢第一個索引開始

十一、若是存取相同的數據,ArrayList 和 LinkedList 誰佔用空間更大?

對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針

對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據,若要從數組中刪除或插入某一個對象,須要移動後段的數組元素,從而會從新調整索引順序,調整索引順序會消耗必定的時間,相反,LinkedList是使用鏈表實現的,若要從鏈表中刪除或插入某一個對象,只須要改變先後對象的引用便可

十二、HashTable 你瞭解過嗎?

Hashtable既不支持Null key也不支持Null value。Hashtable的put()方法的註釋中有說明Hashtable是線程安全的,

Hashtable是線程安全的,它的每一個方法中都加入了Synchronize方法,效率比較低

Hashtable默認的初始大小爲11,以後每次擴充,容量變爲原來的2n+1。

Hashtable在計算元素的位置時須要進行一次除法運算,而除法運算是比較耗時的。

1三、synchronized、lock

synchronized是java中的一個關鍵字,也就是說是Java語言內置的特性

若是一個代碼塊被synchronized修飾了,當一個線程獲取了對應的鎖,並執行該代碼塊時,其餘線程便只能一直等待,等待獲取鎖的線程釋放鎖,而這裏獲取鎖的線程釋放鎖只會有兩種狀況:

1)獲取鎖的線程執行完了該代碼塊,而後線程釋放對鎖的佔有;

2)線程執行發生異常,此時JVM會讓線程自動釋放鎖

那麼若是這個獲取鎖的線程因爲要等待IO或者其餘緣由(好比調用sleep方法)被阻塞了,可是又沒有釋放鎖,其餘線程便只能乾巴巴地等待,試想一下,這多麼影響程序執行效率。

所以就須要有一種機制能夠不讓等待的線程一直無期限地等待下去(好比只等待必定的時間或者可以響應中斷),經過Lock就能夠辦到。

再舉個例子:當有多個線程讀寫文件時,讀操做和寫操做會發生衝突現象,寫操做和寫操做會發生衝突現象,可是讀操做和讀操做不會發生衝突現象。

可是採用synchronized關鍵字來實現同步的話,就會致使一個問題:

若是多個線程都只是進行讀操做,因此當一個線程在進行讀操做時,其餘線程只能等待沒法進行讀操做。

所以就須要一種機制來使得多個線程都只是進行讀操做時,線程之間不會發生衝突,經過Lock就能夠辦到。

另外,經過Lock能夠知道線程有沒有成功獲取到鎖。這個是synchronized沒法辦到的。

1四、cas 操做

java.util.concurrent包中藉助CAS實現了區別於synchronized同步鎖的一種樂觀鎖。

cas是比較並交換算法

CAS有3個操做數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改成B,不然什麼都不作。

JDK提供了AtomicReference類來保證引用對象之間的原子性,就能夠把多個變量放在一個對象裏來進行CAS操做。

1五、lock 和 synchronized 的區別?

(1)Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現;

(2)synchronized在發生異常時,會自動釋放線程佔有的鎖,所以不會致使死鎖現象發生;而Lock在發生異常時,若是沒有主動經過unLock()去釋放鎖,則極可能形成死鎖現象,所以使用Lock時須要在finally塊中釋放鎖;

(3)Lock可讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不可以響應中斷;

(4)經過Lock能夠知道有沒有成功獲取鎖,而synchronized卻沒法辦到。

(5)Lock能夠提升多個線程進行讀操做的效率。

在性能上來講,若是競爭資源不激烈,二者的性能是差很少的,而當競爭資源很是激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。因此說,在具體使用時要根據適當狀況選擇。

1六、公平鎖和非公平鎖

公平和非公平鎖的隊列都基於鎖內部維護的一個雙向鏈表,表結點Node的值就是每個請求當前鎖的線程。公平鎖則在於每次都是依次從隊首取值

非公平鎖在等待鎖的過程當中, 若是有任意新的線程妄圖獲取鎖,都是有很大的概率直接獲取到鎖的

(在ReentrantLock中很明顯能夠看到其中同步包括兩種,分別是公平的FairSync和非公平的NonfairSync。公平鎖的做用就是嚴格按照線程啓動的順序來執行的,不容許其餘線程插隊執行的;而非公平鎖是容許插隊的。

默認狀況下ReentrantLock是經過非公平鎖來進行同步的,包括synchronized關鍵字都是如此,由於這樣性能會更好。由於從線程進入了RUNNABLE狀態,能夠執行開始,到實際線程執行是要比較久的時間的。並且,在一個鎖釋放以後,其餘的線程會須要從新來獲取鎖。其中經歷了持有鎖的線程釋放鎖,其餘線程從掛起恢復到RUNNABLE狀態,其餘線程請求鎖,得到鎖,線程執行,這一系列步驟。若是這個時候,存在一個線程直接請求鎖,可能就避開掛起到恢復RUNNABLE狀態的這段消耗,因此性能更優化)

1七、讀寫鎖設計主要解決什麼問題?

多線程,

讀操做能夠共享,寫操做是排他的,讀能夠有多個在讀,寫只有惟一個在寫,同時寫的時候不容許讀。

解決了讀和讀能夠同時進行,讀和寫不能同時進行,寫和寫不能同時進行

1八、MySQL 分頁查詢語句

LIMIT [offset,] rows

offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目

1九、MySQL 事務特性和隔離級別

事務的基本要素(ACID)

(1)原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。

(2)一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。

(3)隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。

(4)持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。

20、事務的併發問題

(1)髒讀:事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據

(2)不可重複讀:事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。

(3)幻讀:系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。

2一、sql having 的使用場景

若是須要對組函數的結果做爲條件,那麼不能使用where子句,必須使用having子句。

2二、前端瀏覽器地址的一個 http 請求到後端整個流程是怎麼樣?

可以說下嗎?

域名解析 --> 發起TCP的3次握手 --> 創建TCP鏈接後發起http請求 -->服務器響應http請求,瀏覽器獲得html代碼 -->瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶

2三、http 默認端口,https 默認端口

HTTP協議代理服務器經常使用端口號:80/8080/3128/8081/9080

HTTPS服務器,默認的端口號爲443/tcp 443/udp

2四、DNS 你知道是幹嗎的嗎?

DNS是指:域名服務器(Domain Name Server)。在Internet上域名與IP地址之間是一一對應的,域名雖然便於人們記憶,但機器之間只能互相認識IP地址,它們之間的轉換工做稱爲域名解析,域名解析須要由專門的域名解析服務器來完成,DNS就是進行域名解析的服務器

完整面試題文檔獲取、最新精選錄播、Java資料、學習導圖免費提供給年後想要跳槽或想升職加薪的程序員,加微信13272413561備註資料便可免費獲取哦
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)

來源:https://mp.toutiao.com/profile_v3/graphic/publish?pgc_id=6781058818970223107
獲取方式:
https://shimo.im/docs/TC9Jq63Tp6HvTXdg/

相關文章
相關標籤/搜索