成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【備戰(zhàn)春招/秋招系列】美團(tuán)面經(jīng)總結(jié)基礎(chǔ)篇 (附詳解答案)

Leck1e / 1803人閱讀

摘要:不同于個(gè)人面經(jīng),這份面經(jīng)具有普適性。我在前面的文章中也提到了應(yīng)該怎么做自我介紹與項(xiàng)目介紹,詳情可以查看這篇文章備戰(zhàn)春招秋招系列初出茅廬的程序員該如何準(zhǔn)備面試。是建立連接時(shí)使用的握手信號(hào)。它表示確認(rèn)發(fā)來(lái)的數(shù)據(jù)已經(jīng)接受無(wú)誤。

該文已加入開(kāi)源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí))。地址:https://github.com/Snailclimb...

【強(qiáng)烈推薦!非廣告!】阿里云雙11褥羊毛活動(dòng):https://m.aliyun.com/act/team... 差不多一折,不過(guò)僅限阿里云新人購(gòu)買(mǎi),不是新人的朋友自己找方法買(mǎi)哦!

系列文章:

【備戰(zhàn)春招/秋招系列1】程序員的簡(jiǎn)歷就該這樣寫(xiě)

【備戰(zhàn)春招/秋招系列2】初出茅廬的程序員該如何準(zhǔn)備面試?

【備戰(zhàn)春招/秋招系列3】Java程序員必備書(shū)單

這是我總結(jié)的美團(tuán)面經(jīng)的基礎(chǔ)篇,后面還有進(jìn)階和終結(jié)篇哦!下面只是我從很多份美團(tuán)面經(jīng)中總結(jié)的在面試中一些常見(jiàn)的問(wèn)題。不同于個(gè)人面經(jīng),這份面經(jīng)具有普適性。每次面試必備的自我介紹、項(xiàng)目介紹這些東西,大家可以自己私下好好思考。我在前面的文章中也提到了應(yīng)該怎么做自我介紹與項(xiàng)目介紹,詳情可以查看這篇文章:【備戰(zhàn)春招/秋招系列2】初出茅廬的程序員該如何準(zhǔn)備面試?。

1. System.out.println(3 | 9);輸出什么?

正確答案:11.

考察知識(shí)點(diǎn):邏輯運(yùn)算符與(&和&&)或(|和||)

&和&&:

共同點(diǎn):它們都表示運(yùn)算符的兩邊都是true時(shí),結(jié)果為true;

不同點(diǎn): & 表示在運(yùn)算時(shí)兩邊都會(huì)計(jì)算,然后再判斷;&&表示先運(yùn)算符號(hào)左邊的東西,然后判斷是否為true,是true就繼續(xù)運(yùn)算右邊的然后判斷并輸出,是false就停下來(lái)直接輸出不會(huì)再運(yùn)行后面的東西。

|和||:

共同點(diǎn):它們都表示運(yùn)算符的兩邊任意一邊為true,結(jié)果為true,兩邊都不是true,結(jié)果就為false;

不同點(diǎn):| 表示兩邊都會(huì)運(yùn)算,然后再判斷結(jié)果;|| 表示先運(yùn)算符號(hào)左邊的東西,然后判斷是否為true,是true就停下來(lái)直接輸出不會(huì)再運(yùn)行后面的東西,是false就繼續(xù)運(yùn)算右邊的然后判斷并輸出。

回到本題:

3 | 9=0011(二進(jìn)制) | 1001(二進(jìn)制)=1011(二進(jìn)制)=11(十進(jìn)制)

2. 說(shuō)一下轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別

轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶(hù)端行為。

轉(zhuǎn)發(fā)(Forword) 通過(guò)RequestDispatcher對(duì)象的forward(HttpServletRequest request,HttpServletResponse response)方法實(shí)現(xiàn)的。RequestDispatcher 可以通過(guò)HttpServletRequestgetRequestDispatcher()方法獲得。例如下面的代碼就是跳轉(zhuǎn)到 login_success.jsp 頁(yè)面。

request.getRequestDispatcher("login_success.jsp").forward(request, response);

重定向(Redirect) 是利用服務(wù)器返回的狀態(tài)嗎來(lái)實(shí)現(xiàn)的??蛻?hù)端瀏覽器請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器會(huì)返回一個(gè)狀態(tài)碼。服務(wù)器通過(guò)HttpServletRequestResponse的setStatus(int status)方法設(shè)置狀態(tài)碼。如果服務(wù)器返回301或者302,則瀏覽器會(huì)到新的網(wǎng)址重新請(qǐng)求該資源。

從地址欄顯示來(lái)說(shuō): forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪(fǎng)問(wèn)目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址. redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.

從數(shù)據(jù)共享來(lái)說(shuō): forward:轉(zhuǎn)發(fā)頁(yè)面和轉(zhuǎn)發(fā)到的頁(yè)面可以共享request里面的數(shù)據(jù). redirect:不能共享數(shù)據(jù).

從運(yùn)用地方來(lái)說(shuō): forward:一般用于用戶(hù)登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊. redirect:一般用于用戶(hù)注銷(xiāo)登陸時(shí)返回主頁(yè)面和跳轉(zhuǎn)到其它的網(wǎng)站等

從效率來(lái)說(shuō): forward:高. redirect:低.

3. 在瀏覽器中輸入url地址 ->> 顯示主頁(yè)的過(guò)程,整個(gè)過(guò)程會(huì)使用哪些協(xié)議

圖解(圖片來(lái)源:《圖解HTTP》):

總體來(lái)說(shuō)分為以下幾個(gè)過(guò)程:

DNS解析

TCP連接

發(fā)送HTTP請(qǐng)求

服務(wù)器處理請(qǐng)求并返回HTTP報(bào)文

瀏覽器解析渲染頁(yè)面

連接結(jié)束

具體可以參考下面這篇文章:

https://segmentfault.com/a/1190000006879700

4. TCP 三次握手和四次揮手

為了準(zhǔn)確無(wú)誤地把數(shù)據(jù)送達(dá)目標(biāo)處,TCP協(xié)議采用了三次握手策略。

漫畫(huà)圖解:

圖片來(lái)源:《圖解HTTP》

簡(jiǎn)單示意圖:

客戶(hù)端–發(fā)送帶有 SYN 標(biāo)志的數(shù)據(jù)包–一次握手–服務(wù)端

服務(wù)端–發(fā)送帶有 SYN/ACK 標(biāo)志的數(shù)據(jù)包–二次握手–客戶(hù)端

客戶(hù)端–發(fā)送帶有帶有 ACK 標(biāo)志的數(shù)據(jù)包–三次握手–服務(wù)端

為什么要三次握手

三次握手的目的是建立可靠的通信信道,說(shuō)到通訊,簡(jiǎn)單來(lái)說(shuō)就是數(shù)據(jù)的發(fā)送與接收,而三次握手最主要的目的就是雙方確認(rèn)自己與對(duì)方的發(fā)送與接收是正常的。

第一次握手:Client 什么都不能確認(rèn);Server 確認(rèn)了對(duì)方發(fā)送正常,自己接收正常。

第二次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送、接收正常;Server 確認(rèn)了:自己接收正常,對(duì)方發(fā)送正常

第三次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送、接收正常;Server 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送接收正常

所以三次握手就能確認(rèn)雙發(fā)收發(fā)功能都正常,缺一不可。

為什么要傳回 SYN

接收端傳回發(fā)送端所發(fā)送的 SYN 是為了告訴發(fā)送端,我接收到的信息確實(shí)就是你所發(fā)送的信號(hào)了。

SYN 是 TCP/IP 建立連接時(shí)使用的握手信號(hào)。在客戶(hù)機(jī)和服務(wù)器之間建立正常的 TCP 網(wǎng)絡(luò)連接時(shí),客戶(hù)機(jī)首先發(fā)出一個(gè) SYN 消息,服務(wù)器使用 SYN-ACK 應(yīng)答表示接收到了這個(gè)消息,最后客戶(hù)機(jī)再以 ACK(Acknowledgement[漢譯:確認(rèn)字符 ,在數(shù)據(jù)通信傳輸中,接收站發(fā)給發(fā)送站的一種傳輸控制字符。它表示確認(rèn)發(fā)來(lái)的數(shù)據(jù)已經(jīng)接受無(wú)誤。 ])消息響應(yīng)。這樣在客戶(hù)機(jī)和服務(wù)器之間才能建立起可靠的TCP連接,數(shù)據(jù)才可以在客戶(hù)機(jī)和服務(wù)器之間傳遞。
傳了 SYN,為啥還要傳 ACK

雙方通信無(wú)誤必須是兩者互相發(fā)送信息都無(wú)誤。傳了 SYN,證明發(fā)送方(主動(dòng)關(guān)閉方)到接收方(被動(dòng)關(guān)閉方)的通道沒(méi)有問(wèn)題,但是接收方到發(fā)送方的通道還需要 ACK 信號(hào)來(lái)進(jìn)行驗(yàn)證。

斷開(kāi)一個(gè) TCP 連接則需要“四次揮手”:

客戶(hù)端-發(fā)送一個(gè) FIN,用來(lái)關(guān)閉客戶(hù)端到服務(wù)器的數(shù)據(jù)傳送

服務(wù)器-收到這個(gè) FIN,它發(fā)回一 個(gè) ACK,確認(rèn)序號(hào)為收到的序號(hào)加1 。和 SYN 一樣,一個(gè) FIN 將占用一個(gè)序號(hào)

服務(wù)器-關(guān)閉與客戶(hù)端的連接,發(fā)送一個(gè)FIN給客戶(hù)端

客戶(hù)端-發(fā)回 ACK 報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1

為什么要四次揮手

任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知,待對(duì)方確認(rèn)后進(jìn)入半關(guān)閉狀態(tài)。當(dāng)另一方也沒(méi)有數(shù)據(jù)再發(fā)送的時(shí)候,則發(fā)出連接釋放通知,對(duì)方確認(rèn)后就完全關(guān)閉了TCP連接。

舉個(gè)例子:A 和 B 打電話(huà),通話(huà)即將結(jié)束后,A 說(shuō)“我沒(méi)啥要說(shuō)的了”,B回答“我知道了”,但是 B 可能還會(huì)有要說(shuō)的話(huà),A 不能要求 B 跟著自己的節(jié)奏結(jié)束通話(huà),于是 B 可能又巴拉巴拉說(shuō)了一通,最后 B 說(shuō)“我說(shuō)完了”,A 回答“知道了”,這樣通話(huà)才算結(jié)束。

上面講的比較概括,推薦一篇講的比較細(xì)致的文章:https://blog.csdn.net/qzcsu/article/details/72861891

5. IP地址與MAC地址的區(qū)別

參考:https://blog.csdn.net/guoweimelon/article/details/50858597

IP地址是指互聯(lián)網(wǎng)協(xié)議地址(Internet Protocol Address)IP Address的縮寫(xiě)。IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式,它為互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)絡(luò)和每一臺(tái)主機(jī)分配一個(gè)邏輯地址,以此來(lái)屏蔽物理地址的差異。

MAC 地址又稱(chēng)為物理地址、硬件地址,用來(lái)定義網(wǎng)絡(luò)設(shè)備的位置。網(wǎng)卡的物理地址通常是由網(wǎng)卡生產(chǎn)廠家寫(xiě)入網(wǎng)卡的,具有全球唯一性。MAC地址用于在網(wǎng)絡(luò)中唯一標(biāo)示一個(gè)網(wǎng)卡,一臺(tái)電腦會(huì)有一或多個(gè)網(wǎng)卡,每個(gè)網(wǎng)卡都需要有一個(gè)唯一的MAC地址。

6. HTTP請(qǐng)求、響應(yīng)報(bào)文格式

HTTP請(qǐng)求報(bào)文主要由請(qǐng)求行、請(qǐng)求頭部、請(qǐng)求正文3部分組成

HTTP響應(yīng)報(bào)文主要由狀態(tài)行、響應(yīng)頭部、響應(yīng)正文3部分組成

詳細(xì)內(nèi)容可以參考:https://blog.csdn.net/a19881029/article/details/14002273

7. 為什么要使用索引?索引這么多優(yōu)點(diǎn),為什么不對(duì)表中的每一個(gè)列創(chuàng)建一個(gè)索引呢?索引是如何提高查詢(xún)速度的?說(shuō)一下使用索引的注意事項(xiàng)?Mysql索引主要使用的兩種數(shù)據(jù)結(jié)構(gòu)?什么是覆蓋索引?

為什么要使用索引?

通過(guò)創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。

可以大大加快 數(shù)據(jù)的檢索速度(大大減少的檢索的數(shù)據(jù)量), 這也是創(chuàng)建索引的最主要的原因。

幫助服務(wù)器避免排序和臨時(shí)表

將隨機(jī)IO變?yōu)轫樞騃O

可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。

索引這么多優(yōu)點(diǎn),為什么不對(duì)表中的每一個(gè)列創(chuàng)建一個(gè)索引呢?

當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。

創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。

索引是如何提高查詢(xún)速度的?

將無(wú)序的數(shù)據(jù)變成相對(duì)有序的數(shù)據(jù)(就像查目錄一樣)

說(shuō)一下使用索引的注意事項(xiàng)

避免 where 子句中對(duì)宇段施加函數(shù),這會(huì)造成無(wú)法命中索引。

在使用InnoDB時(shí)使用與業(yè)務(wù)無(wú)關(guān)的自增主鍵作為主鍵,即使用邏輯主鍵,而不要使用業(yè)務(wù)主鍵。

將打算加索引的列設(shè)置為 NOT NULL ,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描

刪除長(zhǎng)期未使用的索引,不用的索引的存在會(huì)造成不必要的性能損耗 MySQL 5.7 可以通過(guò)查詢(xún) sys 庫(kù)的 chema_unused_indexes 視圖來(lái)查詢(xún)哪些索引從未被使用

在使用 limit offset 查詢(xún)緩慢時(shí),可以借助索引來(lái)提高性能

Mysql索引主要使用的哪兩種數(shù)據(jù)結(jié)構(gòu)?

哈希索引:對(duì)于哈希索引來(lái)說(shuō),底層的數(shù)據(jù)結(jié)構(gòu)就是哈希表,因此在絕大多數(shù)需求為單條記錄查詢(xún)的時(shí)候,可以選擇哈希索引,查詢(xún)性能最快;其余大部分場(chǎng)景,建議選擇BTree索引。

BTree索引:Mysql的BTree索引使用的是B樹(shù)中的B+Tree。但對(duì)于主要的兩種存儲(chǔ)引擎(MyISAM和InnoDB)的實(shí)現(xiàn)方式是不同的。

更多關(guān)于索引的內(nèi)容可以查看我的這篇文章:【思維導(dǎo)圖-索引篇】搞定數(shù)據(jù)庫(kù)索引就是這么簡(jiǎn)單

什么是覆蓋索引?

如果一個(gè)索引包含(或者說(shuō)覆蓋)所有需要查詢(xún)的字段的值,我們就稱(chēng)
之為“覆蓋索引”。我們知道在InnoDB存儲(chǔ)引擎中,如果不是主鍵索引,葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵+列值。最終還是要“回表”,也就是要通過(guò)主鍵再查找一次,這樣就會(huì)比較慢。覆蓋索引就是把要查詢(xún)出的列和索引是對(duì)應(yīng)的,不做回表操作!

8. 進(jìn)程與線(xiàn)程的區(qū)別是什么?進(jìn)程間的幾種通信方式說(shuō)一下?線(xiàn)程間的幾種通信方式知道不?

進(jìn)程與線(xiàn)程的區(qū)別是什么?

線(xiàn)程與進(jìn)程相似,但線(xiàn)程是一個(gè)比進(jìn)程更小的執(zhí)行單位。一個(gè)進(jìn)程在其執(zhí)行的過(guò)程中可以產(chǎn)生多個(gè)線(xiàn)程。與進(jìn)程不同的是同類(lèi)的多個(gè)線(xiàn)程共享同一塊內(nèi)存空間和一組系統(tǒng)資源,所以系統(tǒng)在產(chǎn)生一個(gè)線(xiàn)程,或是在各個(gè)線(xiàn)程之間作切換工作時(shí),負(fù)擔(dān)要比進(jìn)程小得多,也正因?yàn)槿绱耍€(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。另外,也正是因?yàn)楣蚕碣Y源,所以線(xiàn)程中執(zhí)行時(shí)一般都要進(jìn)行同步和互斥??偟膩?lái)說(shuō),進(jìn)程和線(xiàn)程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。

進(jìn)程間的幾種通信方式說(shuō)一下?

管道(pipe):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有血緣關(guān)系的進(jìn)程間使用。進(jìn)程的血緣關(guān)系通常指父子進(jìn)程關(guān)系。管道分為pipe(無(wú)名管道)和fifo(命名管道)兩種,有名管道也是半雙工的通信方式,但是它允許無(wú)親緣關(guān)系進(jìn)程間通信。

信號(hào)量(semophore):信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪(fǎng)問(wèn)。它通常作為一種鎖機(jī)制,防止某進(jìn)程正在訪(fǎng)問(wèn)共享資源時(shí),其他進(jìn)程也訪(fǎng)問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線(xiàn)程之間的同步手段。

消息隊(duì)列(message queue):消息隊(duì)列是由消息組成的鏈表,存放在內(nèi)核中 并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。消息隊(duì)列與管道通信相比,其優(yōu)勢(shì)是對(duì)每個(gè)消息指定特定的消息類(lèi)型,接收的時(shí)候不需要按照隊(duì)列次序,而是可以根據(jù)自定義條件接收特定類(lèi)型的消息。

信號(hào)(signal):信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某一事件已經(jīng)發(fā)生。

共享內(nèi)存(shared memory):共享內(nèi)存就是映射一段能被其他進(jìn)程所訪(fǎng)問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪(fǎng)問(wèn),共享內(nèi)存是最快的IPC方式,它是針對(duì)其他進(jìn)程間的通信方式運(yùn)行效率低而專(zhuān)門(mén)設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。

套接字(socket):套接口也是一種進(jìn)程間的通信機(jī)制,與其他通信機(jī)制不同的是它可以用于不同及其間的進(jìn)程通信。

線(xiàn)程間的幾種通信方式知道不?

1、鎖機(jī)制

互斥鎖:提供了以排它方式阻止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。

讀寫(xiě)鎖:允許多個(gè)線(xiàn)程同時(shí)讀共享數(shù)據(jù),而對(duì)寫(xiě)操作互斥。

條件變量:可以以原子的方式阻塞進(jìn)程,直到某個(gè)特定條件為真為止。對(duì)條件測(cè)試是在互斥鎖的保護(hù)下進(jìn)行的。條件變量始終與互斥鎖一起使用。

2、信號(hào)量機(jī)制:包括無(wú)名線(xiàn)程信號(hào)量與有名線(xiàn)程信號(hào)量

3、信號(hào)機(jī)制:類(lèi)似于進(jìn)程間的信號(hào)處理。

線(xiàn)程間通信的主要目的是用于線(xiàn)程同步,所以線(xiàn)程沒(méi)有象進(jìn)程通信中用于數(shù)據(jù)交換的通信機(jī)制。

9. 為什么要用單例模式?手寫(xiě)幾種線(xiàn)程安全的單例模式?

簡(jiǎn)單來(lái)說(shuō)使用單例模式可以帶來(lái)下面幾個(gè)好處:

對(duì)于頻繁使用的對(duì)象,可以省略創(chuàng)建對(duì)象所花費(fèi)的時(shí)間,這對(duì)于那些重量級(jí)對(duì)象而言,是非??捎^的一筆系統(tǒng)開(kāi)銷(xiāo);

由于 new 操作的次數(shù)減少,因而對(duì)系統(tǒng)內(nèi)存的使用頻率也會(huì)降低,這將減輕 GC 壓力,縮短 GC 停頓時(shí)間。

懶漢式(雙重檢查加鎖版本)

public class Singleton {

    //volatile保證,當(dāng)uniqueInstance變量被初始化成Singleton實(shí)例時(shí),多個(gè)線(xiàn)程可以正確處理uniqueInstance變量
    private volatile static Singleton uniqueInstance;
    private Singleton() {
    }
    public static Singleton getInstance() {
       //檢查實(shí)例,如果不存在,就進(jìn)入同步代碼塊
        if (uniqueInstance == null) {
            //只有第一次才徹底執(zhí)行這里的代碼
            synchronized(Singleton.class) {
               //進(jìn)入同步代碼塊后,再檢查一次,如果仍是null,才創(chuàng)建實(shí)例
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

靜態(tài)內(nèi)部類(lèi)方式

靜態(tài)內(nèi)部實(shí)現(xiàn)的單例是懶加載的且線(xiàn)程安全。

只有通過(guò)顯式調(diào)用 getInstance 方法時(shí),才會(huì)顯式裝載 SingletonHolder 類(lèi),從而實(shí)例化 instance(只有第一次使用這個(gè)單例的實(shí)例的時(shí)候才加載,同時(shí)不會(huì)有線(xiàn)程安全問(wèn)題)。

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}   
10. 簡(jiǎn)單介紹一下bean。知道Spring的bean的作用域與生命周期嗎?

在 Spring 中,那些組成應(yīng)用程序的主體及由 Spring IOC 容器所管理的對(duì)象,被稱(chēng)之為 bean。簡(jiǎn)單地講,bean 就是由 IOC 容器初始化、裝配及管理的對(duì)象,除此之外,bean 就與應(yīng)用程序中的其他對(duì)象沒(méi)有什么區(qū)別了。而 bean 的定義以及 bean 相互間的依賴(lài)關(guān)系將通過(guò)配置元數(shù)據(jù)來(lái)描述。

Spring中的bean默認(rèn)都是單例的,這些單例Bean在多線(xiàn)程程序下如何保證線(xiàn)程安全呢? 例如對(duì)于Web應(yīng)用來(lái)說(shuō),Web容器對(duì)于每個(gè)用戶(hù)請(qǐng)求都創(chuàng)建一個(gè)多帶帶的Sevlet線(xiàn)程來(lái)處理請(qǐng)求,引入Spring框架之后,每個(gè)Action都是單例的,那么對(duì)于Spring托管的單例Service Bean,如何保證其安全呢? Spring的單例是基于BeanFactory也就是Spring容器的,單例Bean在此容器內(nèi)只有一個(gè),Java的單例是基于 JVM,每個(gè) JVM 內(nèi)只有一個(gè)實(shí)例。

Spring的bean的生命周期以及更多內(nèi)容可以查看:一文輕松搞懂Spring中bean的作用域與生命周期

11. Spring 中的事務(wù)傳播行為了解嗎?TransactionDefinition 接口中哪五個(gè)表示隔離級(jí)別的常量? 事務(wù)傳播行為

事務(wù)傳播行為(為了解決業(yè)務(wù)層方法之間互相調(diào)用的事務(wù)問(wèn)題):
當(dāng)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),必須指定事務(wù)應(yīng)該如何傳播。例如:方法可能繼續(xù)在現(xiàn)有事務(wù)中運(yùn)行,也可能開(kāi)啟一個(gè)新事務(wù),并在自己的事務(wù)中運(yùn)行。在TransactionDefinition定義中包括了如下幾個(gè)表示傳播行為的常量:

支持當(dāng)前事務(wù)的情況:

TransactionDefinition.PROPAGATION_REQUIRED: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。

TransactionDefinition.PROPAGATION_SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。

TransactionDefinition.PROPAGATION_MANDATORY: 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。(mandatory:強(qiáng)制性)

不支持當(dāng)前事務(wù)的情況:

TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

TransactionDefinition.PROPAGATION_NEVER: 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。

其他情況:

TransactionDefinition.PROPAGATION_NESTED: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED。

隔離級(jí)別

TransactionDefinition 接口中定義了五個(gè)表示隔離級(jí)別的常量:

TransactionDefinition.ISOLATION_DEFAULT: 使用后端數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別,Mysql 默認(rèn)采用的 REPEATABLE_READ隔離級(jí)別 Oracle 默認(rèn)采用的 READ_COMMITTED隔離級(jí)別.

TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀

TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生

TransactionDefinition.ISOLATION_REPEATABLE_READ: 對(duì)同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生。

TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別。所有的事務(wù)依次逐個(gè)執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說(shuō),該級(jí)別可以防止臟讀、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能。通常情況下也不會(huì)用到該級(jí)別。

12. SpringMVC 原理了解嗎?

客戶(hù)端發(fā)送請(qǐng)求-> 前端控制器 DispatcherServlet 接受客戶(hù)端請(qǐng)求 -> 找到處理器映射 HandlerMapping 解析請(qǐng)求對(duì)應(yīng)的 Handler-> HandlerAdapter 會(huì)根據(jù) Handler 來(lái)調(diào)用真正的處理器開(kāi)處理請(qǐng)求,并處理相應(yīng)的業(yè)務(wù)邏輯 -> 處理器返回一個(gè)模型視圖 ModelAndView -> 視圖解析器進(jìn)行解析 -> 返回一個(gè)視圖對(duì)象->前端控制器 DispatcherServlet 渲染數(shù)據(jù)(Moder)->將得到視圖對(duì)象返回給用戶(hù)

關(guān)于 SpringMVC 原理更多內(nèi)容可以查看我的這篇文章:SpringMVC 工作原理詳解

13. Spring AOP IOC 實(shí)現(xiàn)原理

過(guò)了秋招挺長(zhǎng)一段時(shí)間了,說(shuō)實(shí)話(huà)我自己也忘了如何簡(jiǎn)要概括 Spring AOP IOC 實(shí)現(xiàn)原理,就在網(wǎng)上找了一個(gè)較為簡(jiǎn)潔的答案,下面分享給各位。

IOC: 控制反轉(zhuǎn)也叫依賴(lài)注入。IOC利用java反射機(jī)制,AOP利用代理模式。IOC 概念看似很抽象,但是很容易理解。說(shuō)簡(jiǎn)單點(diǎn)就是將對(duì)象交給容器管理,你只需要在spring配置文件中配置對(duì)應(yīng)的bean以及設(shè)置相關(guān)的屬性,讓spring容器來(lái)生成類(lèi)的實(shí)例對(duì)象以及管理對(duì)象。在spring容器啟動(dòng)的時(shí)候,spring會(huì)把你在配置文件中配置的bean都初始化好,然后在你需要調(diào)用的時(shí)候,就把它已經(jīng)初始化好的那些bean分配給你需要調(diào)用這些bean的類(lèi)。

AOP: 面向切面編程。(Aspect-Oriented Programming) 。AOP可以說(shuō)是對(duì)OOP的補(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu),用以模擬公共行為的一個(gè)集合。實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類(lèi):一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式,對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語(yǔ)法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼,屬于靜態(tài)代理。

你若盛開(kāi),清風(fēng)自來(lái)。 歡迎關(guān)注我的微信公眾號(hào):“Java面試通關(guān)手冊(cè)”,一個(gè)有溫度的微信公眾號(hào)。公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“1”,可以免費(fèi)獲取一份我精心準(zhǔn)備的小禮物哦!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72102.html

相關(guān)文章

  • 備戰(zhàn)春招/秋招系列美團(tuán)Java面經(jīng)總結(jié)進(jìn)階詳解答案

    摘要:我在前面的文章中也提到了應(yīng)該怎么做自我介紹與項(xiàng)目介紹,詳情可以查看這篇文章備戰(zhàn)春招秋招系列初出茅廬的程序員該如何準(zhǔn)備面試。因此基于事件消息對(duì)象驅(qū)動(dòng)的業(yè)務(wù)架構(gòu)可以是一系列流程。 showImg(https://user-gold-cdn.xitu.io/2018/11/14/16711ac29c2ae52c?w=928&h=531&f=png&s=798562); 一 消息隊(duì)列MQ的...

    chengjianhua 評(píng)論0 收藏0
  • 前端最強(qiáng)面經(jīng)匯總

    摘要:獲取的對(duì)象范圍方法獲取的是最終應(yīng)用在元素上的所有屬性對(duì)象即使沒(méi)有代碼,也會(huì)把默認(rèn)的祖宗八代都顯示出來(lái)而只能獲取元素屬性中的樣式。因此對(duì)于一個(gè)光禿禿的元素,方法返回對(duì)象中屬性值如果有就是據(jù)我測(cè)試不同環(huán)境結(jié)果可能有差異而就是。 花了很長(zhǎng)時(shí)間整理的前端面試資源,喜歡請(qǐng)大家不要吝嗇star~ 別只收藏,點(diǎn)個(gè)贊,點(diǎn)個(gè)star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項(xiàng)目地址 https:...

    wangjuntytl 評(píng)論0 收藏0
  • "雙非"應(yīng)屆生校招如何獲得大廠青睞?(內(nèi)前端大廠面經(jīng)+技術(shù)崗超全求職攻略)

    摘要:拿到秋招的同學(xué),如確定入職需與用人單位簽署三方協(xié)議,以保證雙方的利益不受損失。當(dāng)然每個(gè)崗位所要求的側(cè)重點(diǎn)不同,但卻百變不離其宗。方法論要想達(dá)成某個(gè)目標(biāo)都有其特定的方法論,學(xué)習(xí)技術(shù)也不例外,掌握適當(dāng)?shù)膶W(xué)習(xí)方法才能事半功倍。 寫(xiě)在前面的話(huà) 筆者從17年的2月份開(kāi)始準(zhǔn)備春招,其中遇到不少坑,也意識(shí)到自己走過(guò)的彎路。故寫(xiě)了這篇文章總結(jié)一番,本文適合主動(dòng)學(xué)習(xí)的,對(duì)自己要學(xué)的課程不明確的,對(duì)面試有...

    jeffrey_up 評(píng)論0 收藏0
  • "雙非"應(yīng)屆生校招如何獲得大廠青睞?(內(nèi)前端大廠面經(jīng)+技術(shù)崗超全求職攻略)

    摘要:拿到秋招的同學(xué),如確定入職需與用人單位簽署三方協(xié)議,以保證雙方的利益不受損失。當(dāng)然每個(gè)崗位所要求的側(cè)重點(diǎn)不同,但卻百變不離其宗。方法論要想達(dá)成某個(gè)目標(biāo)都有其特定的方法論,學(xué)習(xí)技術(shù)也不例外,掌握適當(dāng)?shù)膶W(xué)習(xí)方法才能事半功倍。 寫(xiě)在前面的話(huà) 筆者從17年的2月份開(kāi)始準(zhǔn)備春招,其中遇到不少坑,也意識(shí)到自己走過(guò)的彎路。故寫(xiě)了這篇文章總結(jié)一番,本文適合主動(dòng)學(xué)習(xí)的,對(duì)自己要學(xué)的課程不明確的,對(duì)面試有...

    lindroid 評(píng)論0 收藏0
  • 備戰(zhàn)春招/秋招系列】Java程序員必備書(shū)單

    摘要:相關(guān)推薦,豆瓣評(píng)分,人評(píng)價(jià)本書(shū)介紹了在編程中條極具實(shí)用價(jià)值的經(jīng)驗(yàn)規(guī)則,這些經(jīng)驗(yàn)規(guī)則涵蓋了大多數(shù)開(kāi)發(fā)人員每天所面臨的問(wèn)題的解決方案。實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)推薦豆瓣評(píng)分,書(shū)的質(zhì)量沒(méi)的說(shuō),推薦大家好好看一下。 該文已加入開(kāi)源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí))。地址:https://github.com/Snailclimb... 【強(qiáng)烈推薦!非廣告!】...

    saucxs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<