美團(tuán)java面試題參考

美團(tuán)java面試題參考

長沙牛耳教育      2022-04-03 06:07:01     10

美團(tuán)java面試題參考,相信大家對美團(tuán)已經(jīng)非常熟悉了,美團(tuán)近年來發(fā)展的越來越好。作為互聯(lián)網(wǎng)企業(yè),美團(tuán)對java開發(fā)人才的需求也是非常大,而且待遇也是

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細(xì)介紹

相信大家對美團(tuán)已經(jīng)非常熟悉了,美團(tuán)近年來發(fā)展的越來越好。作為互聯(lián)網(wǎng)企業(yè),美團(tuán)對java開發(fā)人才的需求也是非常大,而且待遇也是不錯的,因此很多小伙伴也都想學(xué)習(xí)java進(jìn)入美團(tuán)工作。美團(tuán)在招聘人才的時候也是有面試的,長沙牛耳教育java培訓(xùn)機(jī)構(gòu)的小編來給大家一些美團(tuán)java面試題參考,希望對大家有所幫助。

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

正確答案:11.

考察知識點:&和&&;|和||

&和&&:

共同點:兩者都可做邏輯運(yùn)算符。它們都表示運(yùn)算符的兩邊都是true時,結(jié)果為true;

不同點: &也是位運(yùn)算符。& 表示在運(yùn)算時兩邊都會計算,然后再判斷;&&表示先運(yùn)算符號左邊的東西,然后判斷是否為true,是true就繼續(xù)運(yùn)算右邊的然后判斷并輸出,是false就停下來直接輸出不會再運(yùn)行后面的東西。

|和||:

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

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

回到本題:

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

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

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

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

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

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

3.在瀏覽器中輸入url地址到顯示主頁的過程,整個過程會使用哪些協(xié)議

總體來說分為以下幾個過程:

  • DNS解析
  • TCP連接
  • 發(fā)送HTTP請求
  • 服務(wù)器處理請求并返回HTTP報文
  • 瀏覽器解析渲染頁面
  • 連接結(jié)束

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

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

為什么要三次握手

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

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

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

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

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

為什么要傳回 SYN

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

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

傳了 SYN,為啥還要傳 ACK

雙方通信無誤必須是兩者互相發(fā)送信息都無誤。傳了 SYN,證明發(fā)送方(主動關(guān)閉方)到接收方(被動關(guān)閉方)的通道沒有問題,但是接收方到發(fā)送方的通道還需要 ACK 信號來進(jìn)行驗證。

斷開一個 TCP 連接則需要“四次揮手”:

客戶端-發(fā)送一個 FIN,用來關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送服務(wù)器-收到這個 FIN,它發(fā)回一 個 ACK,確認(rèn)序號為收到的序號加1 。和 SYN 一樣,一個 FIN 將占用一個序號服務(wù)器-關(guān)閉與客戶端的連接,發(fā)送一個FIN給客戶端客戶端-發(fā)回 ACK 報文確認(rèn),并將確認(rèn)序號設(shè)置為收到序號加1.

為什么要四次揮手

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

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

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

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

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

6.HTTP請求、響應(yīng)報文格式

HTTP請求報文主要由請求行、請求頭部、請求正文3部分組成

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

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

為什么要使用索引?

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

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

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

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

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

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

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

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

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

索引是如何提高查詢速度的?

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

說一下使用索引的注意事項

(1)避免 where 子句中對字段施加函數(shù),這會造成無法命中索引。

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

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

刪除長期未使用的索引,不用的索引的存在會造成不必要的性能損耗 MySQL 5.7 可以通過查詢 sys 庫的

(4)chema_unused_indexes 視圖來查詢哪些索引從未被使用

(5)在使用 limit offset 查詢緩慢時,可以借助索引來提高性能

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

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

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

什么是覆蓋索引?

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

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

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

線程與進(jìn)程相似,但線程是一個比進(jìn)程更小的執(zhí)行單位。一個進(jìn)程在其執(zhí)行的過程中可以產(chǎn)生多個線程。與進(jìn)程不同的是同類的多個線程共享同一塊內(nèi)存空間和一組系統(tǒng)資源,所以系統(tǒng)在產(chǎn)生一個線程,或是在各個線程之間作切換工作時,負(fù)擔(dān)要比進(jìn)程小得多,也正因為如此,線程也被稱為輕量級進(jìn)程。另外,也正是因為共享資源,所以線程中執(zhí)行時一般都要進(jìn)行同步和互斥。總的來說,進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。

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

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

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

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

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

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

套接字(socket):socket,即套接字是一種通信機(jī)制,憑借這種機(jī)制,客戶/服務(wù)器(即要進(jìn)行通信的進(jìn)程)系統(tǒng)的開發(fā)工作既可以在本地單機(jī)上進(jìn)行,也可以跨網(wǎng)絡(luò)進(jìn)行。也就是說它可以讓不在同一臺計算機(jī)但通過網(wǎng)絡(luò)連接計算機(jī)上的進(jìn)程進(jìn)行通信。也因為這樣,套接字明確地將客戶端和服務(wù)器區(qū)分開來。

線程間的幾種通信方式知道不?

(1)鎖機(jī)制

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

讀寫鎖:允許多個線程同時讀共享數(shù)據(jù),而對寫操作互斥。

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

(2)信號量機(jī)制:包括無名線程信號量與有名線程信號量

(3)信號機(jī)制:類似于進(jìn)程間的信號處理。

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

9.為什么要用單例模式?手寫幾種線程安全的單例模式?

簡單來說使用單例模式可以帶來下面幾個好處:

• 對于頻繁使用的對象,可以省略創(chuàng)建對象所花費的時間,這對于那些重量級對象而言,是非??捎^的一筆系統(tǒng)開銷;

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

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

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

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

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

只有通過顯式調(diào)用 getInstance 方法時,才會顯式裝載 SingletonHolder 類,從而實例化 instance(只有第一次使用這個單例的實例的時候才加載,同時不會有線程安全問題)。

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.簡單介紹一下bean。知道Spring的bean的作用域與生命周期嗎?

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

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

以上就是長沙牛耳教育java培訓(xùn)機(jī)構(gòu)的小編針對“美團(tuán)java面試題參考”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

Java面試題

培訓(xùn)啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險,謹(jǐn)防上當(dāng)。