溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java大廠面試題和答案

發布時間:2020-06-06 14:18:27 來源:億速云 閱讀:564 作者:Leah 欄目:編程語言

這篇文章給大家分享的是有關Java大廠面試題和答案的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

1、常用的負載均衡怎么用?

(1)http重定向

當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。

2、網關能夠為后端服務帶來哪些好處?

后端服務器可以專心處理業務請求,節省了大量連接管理的開銷

3、對象比較是否相同

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

4、hashmap put 方法存放的時候怎么判斷是否是重復的

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

5、Set 和 List 區別?

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

List(列表):集合中的對象按索引位置排序,可以有重復對象,允許按照對象在集合中的索引位置檢索對象。

6、ArrayList 和 LinkedList 區別

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

ArrayList 繼承AbstractList

LinkedList 繼承AbstractSequentialList

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

LinkedList 采用的將對象存放在獨立的空間中,而且在每個空間中還保存下一個鏈接的索引 但是缺點就是查找非常麻煩 要叢第一個索引開始

7、如果存取相同的數據,ArrayList 和 LinkedList 誰占用空間更大?

對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針

對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據,若要從數組中刪除或插入某一個對象,需要移動后段的數組元素,從而會重新調整索引順序,調整索引順序會消耗一定的時間,相反,LinkedList是使用鏈表實現的,若要從鏈表中刪除或插入某一個對象,只需要改變前后對象的引用即可

8、HashTable 你了解過嗎?

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

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

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

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

9、synchronized、lock

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

如果一個代碼塊被synchronized修飾了,當一個線程獲取了對應的鎖,并執行該代碼塊時,其他線程便只能一直等待,等待獲取鎖的線程釋放鎖,而這里獲取鎖的線程釋放鎖只會有兩種情況:

1)獲取鎖的線程執行完了該代碼塊,然后線程釋放對鎖的占有;

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

那么如果這個獲取鎖的線程由于要等待IO或者其他原因(比如調用sleep方法)被阻塞了,但是又沒有釋放鎖,其他線程便只能干巴巴地等待,試想一下,這多么影響程序執行效率。

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

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

但是采用synchronized關鍵字來實現同步的話,就會導致一個問題:

如果多個線程都只是進行讀操作,所以當一個線程在進行讀操作時,其他線程只能等待無法進行讀操作。

因此就需要一種機制來使得多個線程都只是進行讀操作時,線程之間不會發生沖突,通過Lock就可以辦到。

另外,通過Lock可以知道線程有沒有成功獲取到鎖。這個是synchronized無法辦到的

10、cas 操作

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

cas是比較并交換算法

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

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

11、lock 和 synchronized 的區別?

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

(2)synchronized在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

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

(4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

(5)Lock可以提高多個線程進行讀操作的效率。

在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優于synchronized。所以說,在具體使用時要根據適當情況選擇。

12、公平鎖和非公平鎖

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

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

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

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

13、讀寫鎖設計主要解決什么問題?

多線程,

讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀

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

14、MySQL 分頁查詢語句

LIMIT [offset,] rows

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

15、MySQL 事務特性和隔離級別

事務的基本要素(ACID)

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

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

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

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

16、事務的并發問題

(1)臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據

(2)不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果 不一致。

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

17、sql having 的使用場景

如果需要對組函數的結果作為條件,那么不能使用where子句,必須使用having子句

18、前端瀏覽器地址的一個 http 請求到后端整個流程是怎么樣?

能夠說下嗎?

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

19、http 默認端口,https 默認端口

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

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

20、DNS 你知道是干嘛的嗎?

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

以上就是Java大廠面試題和答案的詳細內容了,看完之后是否有所收獲呢?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女