您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Java大廠面試題和答案的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧。
1、常用的負(fù)載均衡怎么用?
(1)http重定向
當(dāng)http代理(比如瀏覽器)向web服務(wù)器請(qǐng)求某個(gè)URL后,web服務(wù)器可以通過http響應(yīng)頭信息中的Location標(biāo)記來(lái)返回一個(gè)新的URL。這意味著HTTP代理需要繼續(xù)請(qǐng)求這個(gè)新的URL,完成自動(dòng)跳轉(zhuǎn)。
(2)DNS負(fù)載均衡
DNS 負(fù)責(zé)提供域名解析服務(wù),當(dāng)訪問某個(gè)站點(diǎn)時(shí),實(shí)際上首先需要通過該站點(diǎn)域名的DNS服務(wù)器來(lái)獲取域名指向的IP地址,在這一過程中,DNS服務(wù)器完成了域名到IP地址的映射,同樣,這樣映射也可以是一對(duì)多的,這時(shí)候,DNS服務(wù)器便充當(dāng)了負(fù)載均衡調(diào)度器,它就像http重定向轉(zhuǎn)換策略一樣,將用戶的請(qǐng)求分散到多臺(tái)服務(wù)器上,但是它的實(shí)現(xiàn)機(jī)制完全不同。
(3)IP負(fù)載均衡(LVS-NAT)
因?yàn)榉聪虼矸?wù)器工作在HTTP層,其本身的開銷就已經(jīng)嚴(yán)重制約了可擴(kuò)展性,從而也限制了它的性能極限。那能否在HTTP層面以下實(shí)現(xiàn)負(fù)載均衡呢?
NAT服務(wù)器:它工作在傳輸層,它可以修改發(fā)送來(lái)的IP數(shù)據(jù)包,將數(shù)據(jù)包的目標(biāo)地址修改為實(shí)際服務(wù)器地址
(4)直接路由(LVS-DR)
NAT是工作在網(wǎng)絡(luò)分層模型的傳輸層(第四層),而直接路由是工作在數(shù)據(jù)鏈路層(第二層),貌似更屌些。它通過修改數(shù)據(jù)包的目標(biāo)MAC地址(沒有修改目標(biāo)IP),將數(shù)據(jù)包轉(zhuǎn)發(fā)到實(shí)際服務(wù)器上,不同的是,實(shí)際服務(wù)器的響應(yīng)數(shù)據(jù)包將直接發(fā)送給客戶羰,而不經(jīng)過調(diào)度器
(5)IP隧道(LVS-TUN)
基于IP隧道的請(qǐng)求轉(zhuǎn)發(fā)機(jī)制:將調(diào)度器收到的IP數(shù)據(jù)包封裝在一個(gè)新的IP數(shù)據(jù)包中,轉(zhuǎn)交給實(shí)際服務(wù)器,然后實(shí)際服務(wù)器的響應(yīng)數(shù)據(jù)包可以直接到達(dá)用戶端。目前Linux大多支持,可以用LVS來(lái)實(shí)現(xiàn),稱為L(zhǎng)VS-TUN,與LVS-DR不同的是,實(shí)際服務(wù)器可以和調(diào)度器不在同一個(gè)WANt網(wǎng)段,調(diào)度器通過 IP隧道技術(shù)來(lái)轉(zhuǎn)發(fā)請(qǐng)求到實(shí)際服務(wù)器,所以實(shí)際服務(wù)器也必須擁有合法的IP地址。
總體來(lái)說,LVS-DR和LVS-TUN都適合響應(yīng)和請(qǐng)求不對(duì)稱的Web服務(wù)器,如何從它們中做出選擇,取決于你的網(wǎng)絡(luò)部署需要,因?yàn)長(zhǎng)VS-TUN可以將實(shí)際服務(wù)器根據(jù)需要部署在不同的地域,并且根據(jù)就近訪問的原則來(lái)轉(zhuǎn)移請(qǐng)求,所以有類似這種需求的,就應(yīng)該選擇LVS-TUN。
2、網(wǎng)關(guān)能夠?yàn)楹蠖朔?wù)帶來(lái)哪些好處?
后端服務(wù)器可以專心處理業(yè)務(wù)請(qǐng)求,節(jié)省了大量連接管理的開銷
3、對(duì)象比較是否相同
equals通常用來(lái)比較兩個(gè)對(duì)象的內(nèi)容是否相等,==用來(lái)比較兩個(gè)對(duì)象的地址是否相等
4、hashmap put 方法存放的時(shí)候怎么判斷是否是重復(fù)的
先比較key的hashCode,再比較相等或equals的,所以重寫hashCode()和equals()方法即可實(shí)現(xiàn)添加重復(fù)元素。
5、Set 和 List 區(qū)別?
Set(集):集合中的對(duì)象不按特定方式排序,并且沒有重復(fù)對(duì)象。它的有些實(shí)現(xiàn)類能對(duì)集合中的對(duì)象按特定方式排序。
List(列表):集合中的對(duì)象按索引位置排序,可以有重復(fù)對(duì)象,允許按照對(duì)象在集合中的索引位置檢索對(duì)象。
6、ArrayList 和 LinkedList 區(qū)別
ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)
ArrayList 繼承AbstractList
LinkedList 繼承AbstractSequentialList
ArrayList 采用的是數(shù)組形式來(lái)保存對(duì)象的,這種方式將對(duì)象放在連續(xù)的位置中,所以最大的缺點(diǎn)就是插入刪除時(shí)非常麻煩
LinkedList 采用的將對(duì)象存放在獨(dú)立的空間中,而且在每個(gè)空間中還保存下一個(gè)鏈接的索引 但是缺點(diǎn)就是查找非常麻煩 要叢第一個(gè)索引開始
7、如果存取相同的數(shù)據(jù),ArrayList 和 LinkedList 誰(shuí)占用空間更大?
對(duì)于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針
對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù),若要從數(shù)組中刪除或插入某一個(gè)對(duì)象,需要移動(dòng)后段的數(shù)組元素,從而會(huì)重新調(diào)整索引順序,調(diào)整索引順序會(huì)消耗一定的時(shí)間,相反,LinkedList是使用鏈表實(shí)現(xiàn)的,若要從鏈表中刪除或插入某一個(gè)對(duì)象,只需要改變前后對(duì)象的引用即可
8、HashTable 你了解過嗎?
Hashtable既不支持Null key也不支持Null value。Hashtable的put()方法的注釋中有說明Hashtable是線程安全的,
Hashtable是線程安全的,它的每個(gè)方法中都加入了Synchronize方法,效率比較低
Hashtable默認(rèn)的初始大小為11,之后每次擴(kuò)充,容量變?yōu)樵瓉?lái)的2n+1。
Hashtable在計(jì)算元素的位置時(shí)需要進(jìn)行一次除法運(yùn)算,而除法運(yùn)算是比較耗時(shí)的。
9、synchronized、lock
synchronized是java中的一個(gè)關(guān)鍵字,也就是說是Java語(yǔ)言內(nèi)置的特性
如果一個(gè)代碼塊被synchronized修飾了,當(dāng)一個(gè)線程獲取了對(duì)應(yīng)的鎖,并執(zhí)行該代碼塊時(shí),其他線程便只能一直等待,等待獲取鎖的線程釋放鎖,而這里獲取鎖的線程釋放鎖只會(huì)有兩種情況:
1)獲取鎖的線程執(zhí)行完了該代碼塊,然后線程釋放對(duì)鎖的占有;
2)線程執(zhí)行發(fā)生異常,此時(shí)JVM會(huì)讓線程自動(dòng)釋放鎖
那么如果這個(gè)獲取鎖的線程由于要等待IO或者其他原因(比如調(diào)用sleep方法)被阻塞了,但是又沒有釋放鎖,其他線程便只能干巴巴地等待,試想一下,這多么影響程序執(zhí)行效率。
因此就需要有一種機(jī)制可以不讓等待的線程一直無(wú)期限地等待下去(比如只等待一定的時(shí)間或者能夠響應(yīng)中斷),通過Lock就可以辦到。
再舉個(gè)例子:當(dāng)有多個(gè)線程讀寫文件時(shí),讀操作和寫操作會(huì)發(fā)生沖突現(xiàn)象,寫操作和寫操作會(huì)發(fā)生沖突現(xiàn)象,但是讀操作和讀操作不會(huì)發(fā)生沖突現(xiàn)象。
但是采用synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)同步的話,就會(huì)導(dǎo)致一個(gè)問題:
如果多個(gè)線程都只是進(jìn)行讀操作,所以當(dāng)一個(gè)線程在進(jìn)行讀操作時(shí),其他線程只能等待無(wú)法進(jìn)行讀操作。
因此就需要一種機(jī)制來(lái)使得多個(gè)線程都只是進(jìn)行讀操作時(shí),線程之間不會(huì)發(fā)生沖突,通過Lock就可以辦到。
另外,通過Lock可以知道線程有沒有成功獲取到鎖。這個(gè)是synchronized無(wú)法辦到的
10、cas 操作
java.util.concurrent包中借助CAS實(shí)現(xiàn)了區(qū)別于synchronized同步鎖的一種樂觀鎖
cas是比較并交換算法
CAS有3個(gè)操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做
JDK提供了AtomicReference類來(lái)保證引用對(duì)象之間的原子性,就可以把多個(gè)變量放在一個(gè)對(duì)象里來(lái)進(jìn)行CAS操作。
11、lock 和 synchronized 的區(qū)別?
(1)Lock是一個(gè)接口,而synchronized是Java中的關(guān)鍵字,synchronized是內(nèi)置的語(yǔ)言實(shí)現(xiàn);
(2)synchronized在發(fā)生異常時(shí),會(huì)自動(dòng)釋放線程占有的鎖,因此不會(huì)導(dǎo)致死鎖現(xiàn)象發(fā)生;而Lock在發(fā)生異常時(shí),如果沒有主動(dòng)通過unLock()去釋放鎖,則很可能造成死鎖現(xiàn)象,因此使用Lock時(shí)需要在finally塊中釋放鎖;
(3)Lock可以讓等待鎖的線程響應(yīng)中斷,而synchronized卻不行,使用synchronized時(shí),等待的線程會(huì)一直等待下去,不能夠響應(yīng)中斷;
(4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無(wú)法辦到。
(5)Lock可以提高多個(gè)線程進(jìn)行讀操作的效率。
在性能上來(lái)說,如果競(jìng)爭(zhēng)資源不激烈,兩者的性能是差不多的,而當(dāng)競(jìng)爭(zhēng)資源非常激烈時(shí)(即有大量線程同時(shí)競(jìng)爭(zhēng)),此時(shí)Lock的性能要遠(yuǎn)遠(yuǎn)優(yōu)于synchronized。所以說,在具體使用時(shí)要根據(jù)適當(dāng)情況選擇。
12、公平鎖和非公平鎖
公平和非公平鎖的隊(duì)列都基于鎖內(nèi)部維護(hù)的一個(gè)雙向鏈表,表結(jié)點(diǎn)Node的值就是每一個(gè)請(qǐng)求當(dāng)前鎖的線程。公平鎖則在于每次都是依次從隊(duì)首取值
非公平鎖在等待鎖的過程中, 如果有任意新的線程妄圖獲取鎖,都是有很大的幾率直接獲取到鎖的
(在ReentrantLock中很明顯可以看到其中同步包括兩種,分別是公平的FairSync和非公平的NonfairSync。公平鎖的作用就是嚴(yán)格按照線程啟動(dòng)的順序來(lái)執(zhí)行的,不允許其他線程插隊(duì)執(zhí)行的;而非公平鎖是允許插隊(duì)的。
默認(rèn)情況下ReentrantLock是通過非公平鎖來(lái)進(jìn)行同步的,包括synchronized關(guān)鍵字都是如此,因?yàn)檫@樣性能會(huì)更好。因?yàn)閺木€程進(jìn)入了RUNNABLE狀態(tài),可以執(zhí)行開始,到實(shí)際線程執(zhí)行是要比較久的時(shí)間的。而且,在一個(gè)鎖釋放之后,其他的線程會(huì)需要重新來(lái)獲取鎖。其中經(jīng)歷了持有鎖的線程釋放鎖,其他線程從掛起恢復(fù)到RUNNABLE狀態(tài),其他線程請(qǐng)求鎖,獲得鎖,線程執(zhí)行,這一系列步驟。如果這個(gè)時(shí)候,存在一個(gè)線程直接請(qǐng)求鎖,可能就避開掛起到恢復(fù)RUNNABLE狀態(tài)的這段消耗,所以性能更優(yōu)化)
13、讀寫鎖設(shè)計(jì)主要解決什么問題?
多線程,
讀操作可以共享,寫操作是排他的,讀可以有多個(gè)在讀,寫只有唯一個(gè)在寫,同時(shí)寫的時(shí)候不允許讀
解決了讀和讀可以同時(shí)進(jìn)行,讀和寫不能同時(shí)進(jìn)行,寫和寫不能同時(shí)進(jìn)行
14、MySQL 分頁(yè)查詢語(yǔ)句
LIMIT [offset,] rows
offset指定要返回的第一行的偏移量,rows第二個(gè)指定返回行的最大數(shù)目
15、MySQL 事務(wù)特性和隔離級(jí)別
事務(wù)的基本要素(ACID)
(1)原子性(Atomicity):事務(wù)開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環(huán)節(jié)。事務(wù)執(zhí)行過程中出錯(cuò),會(huì)回滾到事務(wù)開始前的狀態(tài),所有的操作就像沒有發(fā)生一樣。也就是說事務(wù)是一個(gè)不可分割的整體,就像化學(xué)中學(xué)過的原子,是物質(zhì)構(gòu)成的基本單位。
(2)一致性(Consistency):事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫(kù)的完整性約束沒有被破壞 。比如A向B轉(zhuǎn)賬,不可能A扣了錢,B卻沒收到。
(3)隔離性(Isolation):同一時(shí)間,只允許一個(gè)事務(wù)請(qǐng)求同一數(shù)據(jù),不同的事務(wù)之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,B不能向這張卡轉(zhuǎn)賬。
(4)持久性(Durability):事務(wù)完成后,事務(wù)對(duì)數(shù)據(jù)庫(kù)的所有更新將被保存到數(shù)據(jù)庫(kù),不能回滾。
16、事務(wù)的并發(fā)問題
(1)臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
(2)不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中,對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果 不一致。
(3)幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫(kù)中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來(lái),就好像發(fā)生了幻覺一樣,這就叫幻讀。
17、sql having 的使用場(chǎng)景
如果需要對(duì)組函數(shù)的結(jié)果作為條件,那么不能使用where子句,必須使用having子句
18、前端瀏覽器地址的一個(gè) http 請(qǐng)求到后端整個(gè)流程是怎么樣?
能夠說下嗎?
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 -->服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 -->瀏覽器解析html代碼,并請(qǐng)求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶
19、http 默認(rèn)端口,https 默認(rèn)端口
HTTP協(xié)議代理服務(wù)器常用端口號(hào):80/8080/3128/8081/9080
HTTPS服務(wù)器,默認(rèn)的端口號(hào)為443/tcp 443/udp
20、DNS 你知道是干嘛的嗎?
DNS是指:域名服務(wù)器(Domain Name Server)。在Internet上域名與IP地址之間是一一對(duì)應(yīng)的,域名雖然便于人們記憶,但機(jī)器之間只能互相認(rèn)識(shí)IP地址,它們之間的轉(zhuǎn)換工作稱為域名解析,域名解析需要由專門的域名解析服務(wù)器來(lái)完成,DNS就是進(jìn)行域名解析的服務(wù)器
以上就是Java大廠面試題和答案的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。