精選8道滴滴、360公司的Java技術(shù)面試題(附答案)
1.JVM中加載類的時(shí)機(jī)具體舉例?以及雙親委派加載的機(jī)制是什么?
(1)JVM中加載類的時(shí)機(jī)具體舉例:
1)使用new關(guān)鍵字實(shí)例化對(duì)象,讀取或設(shè)置一個(gè)雷的靜態(tài)字段以及調(diào)用一個(gè)類的靜態(tài)方法的時(shí)候
2)使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用時(shí),如果此類沒(méi)有初始化,則要觸發(fā)其初始化
3)當(dāng)初始化一個(gè)類是,發(fā)現(xiàn)其父類還沒(méi)有進(jìn)行初始化,則需要先觸發(fā)其父類的初始化
4)當(dāng)虛擬機(jī)啟動(dòng)是,用戶需要指定一個(gè)要運(yùn)行的主類,虛擬機(jī)會(huì)先初始化這個(gè)主類
(2)雙親委派加載的機(jī)制:
當(dāng)一個(gè)類收到了類加載請(qǐng)求,它首先不會(huì)嘗試自己去加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類完成,每一個(gè)層次類加載器都是如此,因此,所有的加載請(qǐng)求都應(yīng)該傳送到啟動(dòng)類加載其中,只有當(dāng)父類加載器反饋?zhàn)约簾o(wú)法完成這個(gè)請(qǐng)求的時(shí)候,子類加載才會(huì)嘗試自己去加載。
2. Http協(xié)議和Https協(xié)議的區(qū)別是什么?
1)https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)較少,因而需要一定費(fèi)用。
2)http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
3)http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4)http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
3. http協(xié)議中的Get請(qǐng)求和Post請(qǐng)求的區(qū)別是什么?
1) GET請(qǐng)求的數(shù)據(jù)是放在HTTP包頭中的,也就是URL之后,通常是像下面這樣定義格式的,(而Post是把提交的數(shù)據(jù)放在HTTP正文中的)。
login.action?name=hyddd&password=idontknow&verify=%E4%BD%E5%A5%BD
a,以 ?來(lái)分隔URL和數(shù)據(jù);
b,以& 來(lái)分隔參數(shù);
c,如果數(shù)據(jù)是英文或數(shù)字,原樣發(fā)送;
d,如果數(shù)據(jù)是中文或其它字符,則進(jìn)行BASE64編碼。?
2)GET提交的數(shù)據(jù)比較少,最多1024B,因?yàn)镚ET數(shù)據(jù)是附在URL之后的,而URL則會(huì)受到不同環(huán)境的限制的,比如說(shuō)IE對(duì)其限制為2K+35,而POST可以傳送更多的數(shù)據(jù)(理論上是沒(méi)有限制的,但一般也會(huì)受不同的環(huán)境,如瀏覽器、操作系統(tǒng)、服務(wù)器處理能力等限制,IIS4可支持80KB,IIS5可支持100KB)。
3)Post的安全性要比Get高,因?yàn)镚et時(shí),參數(shù)數(shù)據(jù)是明文傳輸?shù)?,而且使用GET的話,還可能造成Cross-site request forgery攻擊。而POST數(shù)據(jù)則可以加密的,但GET的速度可能會(huì)快些。
所以綜上幾點(diǎn),總結(jié)成下表:
4. TCP/IP協(xié)議中三次握手機(jī)制具體是什么?窗口滑動(dòng)機(jī)制的作用和基本機(jī)制是什么?
Tcp/Ip協(xié)議的三次握手機(jī)制圖:

具體解釋如下:
第一次握手:客戶端向服務(wù)器端發(fā)送連接請(qǐng)求包SYN(syn=j),等待服務(wù)器回應(yīng);
第二次握手:服務(wù)器端收到客戶端連接請(qǐng)求包SYN(syn=j)后,將客戶端的請(qǐng)求包SYN(syn=j)放入到自己的未連接隊(duì)列,此時(shí)服務(wù)器需要發(fā)送兩個(gè)包給客戶端;
(1)向客戶端發(fā)送確認(rèn)自己收到其連接請(qǐng)求的確認(rèn)包ACK(ack=j+1),向客戶端表明已知道了其連接請(qǐng)求
(2)向客戶端發(fā)送連接詢問(wèn)請(qǐng)求包SYN(syn=k),詢問(wèn)客戶端是否已經(jīng)準(zhǔn)備好建立連接,進(jìn)行數(shù)據(jù)通信;
第三次握手:客戶端收到服務(wù)器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服務(wù)器同意建立連接,此時(shí)需要發(fā)送連接已建立的消息給服務(wù)器;
向服務(wù)器發(fā)送連接建立的確認(rèn)包ACK(ack=k+1),回應(yīng)服務(wù)器的SYN(syn=k)告訴服務(wù)器,我們之間已經(jīng)建立了連接,可以進(jìn)行數(shù)據(jù)通信。
ACK(ack=k+1)包發(fā)送完畢,服務(wù)器收到后,此時(shí)服務(wù)器與客戶端進(jìn)入ESTABLISHED狀態(tài),開(kāi)始進(jìn)行數(shù)據(jù)傳送。
窗口滑動(dòng)機(jī)制的作用:
TCP協(xié)議作為一個(gè)可靠的面向流的傳輸協(xié)議,其可靠性和流量控制由滑動(dòng)窗口協(xié)議保證,而擁塞控制則由控制窗口結(jié)合一系列的控制算法實(shí)現(xiàn)。
具體介紹:
窗口滑動(dòng)就是說(shuō)一次傳輸幾個(gè)數(shù)據(jù)。對(duì)所有數(shù)據(jù)幀按順序賦予編號(hào),發(fā)送方在發(fā)送過(guò)程中始終保持著一個(gè)發(fā)送窗口,只有落在發(fā)送窗口內(nèi)的幀才允許被發(fā)送;同時(shí)接收方也維持著一個(gè)接收窗口,只有落在接收窗口內(nèi)的幀才允許接收。這樣通過(guò)調(diào)整發(fā)送方窗口和接收方窗口的大小可以實(shí)現(xiàn)流量控制。
5. Dubbo的優(yōu)點(diǎn)是什么?Dubbo對(duì)分布式事務(wù)是如何處理的?
Dubbo的優(yōu)點(diǎn):
1)Dubbo具有調(diào)度、發(fā)現(xiàn)、監(jiān)控、治理等功能,支持相當(dāng)豐富的服務(wù)治理能力
2)集群容錯(cuò)
當(dāng)服務(wù)調(diào)用失敗時(shí),根據(jù)我們的業(yè)務(wù)不同,可以使用不同的策略來(lái)應(yīng)對(duì)這種失敗。
3)負(fù)載均衡
當(dāng)同一個(gè)服務(wù)有多個(gè)提供者在提供服務(wù)時(shí), 客戶端如何正確的選擇提供者實(shí)現(xiàn)負(fù)載均衡dubbo也給我們提供了幾種方案
4)多協(xié)議
dubbo提供了多種協(xié)議給用戶選擇, 如Dubbo協(xié)議、Hessian協(xié)議、HTTP協(xié)議、RMI協(xié)議、WebService協(xié)議、Thrift協(xié)議、Memcached協(xié)議、Redis協(xié)議。
Dubbo對(duì)分布式事務(wù)的處理:
分布式事務(wù)暫不支持。用戶可以自己根據(jù)實(shí)際情況來(lái)實(shí)現(xiàn)分布式事務(wù),比如:
1)結(jié)合RocketMQ消息中間件實(shí)現(xiàn)的可靠消息最終一致性
2)TCC補(bǔ)償性事務(wù)解決方案
3)最大努力通知型方案
6. Mysql數(shù)據(jù)庫(kù)的左連接、右連接、全連接?
左連接、右連接、全連接整體上屬于外連接的范疇。具體來(lái)講如下:
1)左連接:left join
左向外聯(lián)接的結(jié)果集包括 left join子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒(méi)有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值。
左連接sql舉例:
select A.*,B.* from A left join B on A.id=B.infoid
2)右連接:right join
右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某行在左表中沒(méi)有匹配行,則將為左表返回空值。
右連接sql舉例:
select A.*,B.* from A right join B on A.id=B.infoid
3)全連接:full join
完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒(méi)有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。
全連接sql舉例:
select A.*,B.* from A full join B on A.id=B.infoid
7. 數(shù)據(jù)庫(kù)的悲觀鎖、樂(lè)觀鎖的機(jī)制和使用場(chǎng)景是什么??
悲觀鎖:
悲觀鎖的特點(diǎn)是先獲取鎖,再進(jìn)行業(yè)務(wù)操作,即“悲觀”的認(rèn)為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進(jìn)行業(yè)務(wù)操作。
悲觀鎖的使用場(chǎng)景:
并發(fā)量不大且不允許臟讀,可以使用悲觀鎖解決并發(fā)問(wèn)題
樂(lè)觀鎖:
樂(lè)觀鎖是先進(jìn)行業(yè)務(wù)操作,不到萬(wàn)不得已不去拿鎖。即“樂(lè)觀”的認(rèn)為拿鎖多半是會(huì)成功的,因此在進(jìn)行完業(yè)務(wù)操作需要實(shí)際更新數(shù)據(jù)的最后一步再去拿一下鎖。
樂(lè)觀鎖的使用場(chǎng)景:
1)樂(lè)觀鎖在不發(fā)生取鎖失敗的情況下開(kāi)銷比悲觀鎖小,但是一旦發(fā)生失敗回滾開(kāi)銷則比較大,因此適合用在取鎖失敗概率比較小的場(chǎng)景,可以提升系統(tǒng)并發(fā)性能
2)樂(lè)觀鎖還適用于一些比較特殊的場(chǎng)景,例如在業(yè)務(wù)操作過(guò)程中無(wú)法和數(shù)據(jù)庫(kù)保持連接等悲觀鎖無(wú)法適用的地方
8. Zookeeper的典型應(yīng)用場(chǎng)景是什么?
1)命名服務(wù)(Naming Service)
2)數(shù)據(jù)發(fā)布與訂閱(配置中心)
3)分布式通知/協(xié)調(diào)
4)集群管理與Master選舉
5)分布式鎖
6)分布式隊(duì)列
