騰訊面試體驗倍兒好
時間:2023-06-23 04:00:31
今天給大家分享騰訊春招的實習(xí)面經(jīng),崗位Java后端,主要問了MySQL、Java、網(wǎng)絡(luò)這三大塊。
(資料圖片僅供參考)
求職者覺得這場面試非常有收獲,雖然都是基礎(chǔ)問題,但是往下深挖根莖葉脈全部相連。反問環(huán)節(jié)面試官給了他很多建議,包括面試、策略、基礎(chǔ)、算法等等,是一次寶貴的學(xué)習(xí)經(jīng)歷。
MySQL
介紹一下MySQL的索引機(jī)制
索引可以幫助我們快速搜索數(shù)據(jù),innodb 存儲引擎用的是 b+樹索引,葉子節(jié)點存放的是索引+數(shù)據(jù),非葉子節(jié)點只存放索引。
可以按照四個角度來分類索引。
聯(lián)合索引是什么?
通過將多個字段組合成一個索引,該索引就被稱為聯(lián)合索引。
比如,將商品表中的 product_no 和 name 字段組合成聯(lián)合索引(product_no, name),創(chuàng)建聯(lián)合索引的方式如下:
CREATEINDEXindex_product_no_nameONproduct(product_no,name);聯(lián)合索引(product_no, name)的 B+Tree 示意圖如下(圖中葉子節(jié)點之間畫了單向鏈表,但是實際上是雙向鏈表,原圖找不到了,修改不了,偷個懶不重畫了,大家腦補(bǔ)成雙向鏈表就行)。
可以看到,聯(lián)合索引的非葉子節(jié)點用兩個字段的值作為 B+Tree 的 key 值。當(dāng)在聯(lián)合索引查詢數(shù)據(jù)時,先按 product_no 字段比較,在 product_no 相同的情況下再按 name 字段比較。
也就是說,聯(lián)合索引查詢的 B+Tree 是先按 product_no 進(jìn)行排序,然后再 product_no 相同的情況再按 name 字段排序。
因此,使用聯(lián)合索引時,存在最左匹配原則,也就是按照最左優(yōu)先的方式進(jìn)行索引的匹配。在使用聯(lián)合索引進(jìn)行查詢的時候,如果不遵循「最左匹配原則」,聯(lián)合索引會失效,這樣就無法利用到索引快速查詢的特性了。
什么是聚簇索引?
聚簇索引的 B+Tree 的葉子節(jié)點存放的是實際數(shù)據(jù),所有完整的用戶記錄都存放在主鍵索引的 B+Tree 的葉子節(jié)點里。
什么是覆蓋索引?
在查詢時使用了二級索引,如果查詢的數(shù)據(jù)能在二級索引里查詢的到,那么就不需要回表,這個過程就是覆蓋索引。如果查詢的數(shù)據(jù)不在二級索引里,就會先檢索二級索引,找到對應(yīng)的葉子節(jié)點,獲取到主鍵值后,然后再檢索主鍵索引,就能查詢到數(shù)據(jù)了,這個過程就是回表。
整個索引查詢的過程是怎樣的?
InnoDB 里的 B+ 樹中的每個節(jié)點都是一個數(shù)據(jù)頁,結(jié)構(gòu)示意圖如下:
B+ 樹如何實現(xiàn)快速查找主鍵為 6 的記錄,以上圖為例子:
可以看到,在定位記錄所在哪一個頁時,也是通過二分法快速定位到包含該記錄的頁。定位到該頁后,又會在該頁內(nèi)進(jìn)行二分法快速定位記錄所在的分組(槽號),最后在分組內(nèi)進(jìn)行遍歷查找。
事務(wù)的隔離級別有哪些?
臟讀、幻讀、不可重讀分別是什么意思?
InnoDB 多版本并發(fā)控制的具體原理,底層細(xì)節(jié)?
對于「讀提交」和「可重復(fù)讀」隔離級別的事務(wù)來說,它們是通過 Read View 來實現(xiàn)的,它們的區(qū)別在于創(chuàng)建 Read View 的時機(jī)不同,大家可以把 Read View 理解成一個數(shù)據(jù)快照,就像相機(jī)拍照那樣,定格某一時刻的風(fēng)景。
Read View 有四個重要的字段:
對于使用 InnoDB 存儲引擎的數(shù)據(jù)庫表,它的聚簇索引記錄中都包含下面兩個隱藏列:
在創(chuàng)建 Read View 后,我們可以將記錄中的 trx_id 劃分這三種情況:
一個事務(wù)去訪問記錄的時候,除了自己的更新記錄總是可見之外,還有這幾種情況:
min_trx_id值,表示這個版本的記錄是在創(chuàng)建 Read View 前已經(jīng)提交的事務(wù)生成的,所以該版本的記錄對當(dāng)前事務(wù) 可見。 max_trx_id值,表示這個版本的記錄是在創(chuàng)建 Read View 后才啟動的事務(wù)生成的,所以該版本的記錄對當(dāng)前事務(wù) 不可見。 m_ids列表中,表示生成該版本記錄的活躍事務(wù)依然活躍著(還沒提交事務(wù)),所以該版本的記錄對當(dāng)前事務(wù) 不可見。 m_ids列表中,表示生成該版本記錄的活躍事務(wù)已經(jīng)被提交,所以該版本的記錄對當(dāng)前事務(wù) 可見。 這種通過「版本鏈」來控制并發(fā)事務(wù)訪問同一個記錄時的行為就叫 MVCC(多版本并發(fā)控制)。
next Key是什么,怎么實現(xiàn)?
Next-Key Lock 稱為臨鍵鎖,是 Record Lock + Gap Lock 的組合,鎖定一個范圍,并且鎖定記錄本身。
假設(shè),表中有一個范圍 id 為(3,5] 的 next-key lock,那么其他事務(wù)即不能插入 id = 4 記錄,也不能修改 id = 5 這條記錄。
所以,next-key lock 即能保護(hù)該記錄,又能阻止其他事務(wù)將新紀(jì)錄插入到被保護(hù)記錄前面的間隙中。
索引失效的場景有哪些,你知道什么改進(jìn)方法嗎?
like %xx或者 like %xx%這兩種方式都會造成索引失效; 提交事務(wù)的一整個過程,每個日志都是怎么工作的?
具體更新一條記錄 UPDATE t_user SET name = "xiaolin" WHERE id = 1;的流程如下:
Java
JVM內(nèi)存區(qū)域 每一個區(qū)域的內(nèi)容?
JVM的內(nèi)存結(jié)構(gòu)主要分為以下幾個部分:
程序計數(shù)器(Program Counter Register):每個線程都有一個程序計數(shù)器。當(dāng)線程執(zhí)行 Java 方法時,程序計數(shù)器保存當(dāng)前執(zhí)行指令的地址,以便在 JVM 調(diào)用其他方法或恢復(fù)線程執(zhí)行時重新回到正確的位置。
Java 虛擬機(jī)棧(Java Virtual Machine Stacks):每個線程都有一個虛擬機(jī)棧。虛擬機(jī)棧保存著方法執(zhí)行期間的局部變量、操作數(shù)棧、方法出口等信息。線程每調(diào)用一個 Java 方法時,會創(chuàng)建一個棧幀(Stack Frame),棧幀包含著該方法的局部變量、操作數(shù)棧、方法返回地址等信息。棧幀在方法執(zhí)行結(jié)束后會被彈出。
本地方法棧(Native Method Stack):與 Java 虛擬機(jī)棧類似,但是為本地方法服務(wù)。
Java 堆(Java Heap):Java 堆是 Java 虛擬機(jī)中最大的一塊內(nèi)存區(qū)域,用于存儲各種類型的對象實例,也是垃圾收集器的主要工作區(qū)域。Java 堆是所有線程共享的部分。
方法區(qū)(Method Area):方法區(qū)也是所有線程共享的部分,它用于存儲類的加載信息、靜態(tài)變量、常量池、方法字節(jié)碼等數(shù)據(jù)。在 Java 8 及以前的版本中,方法區(qū)被實現(xiàn)為永久代(Permanent Generation),在 Java 8 中被改為元空間(Metaspace)。
JVM異常問題?
String保存在哪里呢
String 保存在字符串常量池中,不同于其他對象,它的值是不可變的,且可以被多個引用共享。
java版本改動問題 有哪些主要區(qū)別?
Java 7 新特性:鉆石操作符、try-with-resource語句、支持動態(tài)類型語言、Fork/Join框架等。
Java 8 新特性:Lambda 表達(dá)式、Stream API、新的 Date/Time API、Nashorn JavaScript 引擎等。
怎么找到需要回收的垃圾?
Java中的垃圾回收機(jī)制通過判斷對象是否可達(dá)來確定哪些對象可以被回收。當(dāng)一個對象沒有任何引用指向它時,它就可以被回收,這個過程由JVM的垃圾回收器自動完成。
JVM使用可達(dá)性分析算法來判斷對象是否可達(dá)。從GC Roots對象開始,通過一系列的引用鏈來遍歷所有的對象,如果一個對象不可達(dá),則說明它已經(jīng)死亡,可以被回收了。
在Java中,有4種引用類型:強(qiáng)引用、軟引用、弱引用和虛引用。其中,強(qiáng)引用是最常見的引用類型,只要強(qiáng)引用存在,垃圾回收器就不會回收該對象。軟引用、弱引用和虛引用則分別表示對對象的軟引用、弱引用和虛引用,當(dāng)垃圾回收器進(jìn)行垃圾回收時,會根據(jù)不同的引用類型來決定是否回收對象。
有哪些常見的垃圾回收器,舉幾個說說?
Serial收集器:單線程的垃圾回收器,使用標(biāo)記-復(fù)制算法,適合小型應(yīng)用程序或客戶端應(yīng)用程序。
Parallel收集器:多線程的垃圾回收器,使用標(biāo)記-復(fù)制算法,適合在后臺運行的中型應(yīng)用程序。
CMS收集器:并發(fā)垃圾回收器,使用標(biāo)記-清除算法,適合對響應(yīng)時間有要求的中型應(yīng)用程序。
G1收集器:并發(fā)垃圾回收器,使用標(biāo)記-整理算法,適合對響應(yīng)時間有要求且堆內(nèi)存較大的應(yīng)用程序。
其中,Serial收集器和Parallel收集器是新生代收集器,CMS和G1是老年代收集器。
HashMap底層怎么實現(xiàn)的 ?線程安全嗎?
HashMap底層是基于數(shù)組和鏈表實現(xiàn)的。簡單來說,HashMap將key通過hash算法映射到數(shù)組中,然后在對應(yīng)的鏈表中查找value。當(dāng)多個key的hash值相同時,會在同一個數(shù)組位置上使用鏈表來存儲這些key-value。但是,當(dāng)鏈表長度太長時,會影響HashMap的性能,因此在中,當(dāng)鏈表長度超過閾值時,會將鏈表轉(zhuǎn)換為紅黑樹,以提高查找效率。
HashMap不是線程安全的,因為多個線程同時訪問HashMap時可能會導(dǎo)致數(shù)據(jù)不一致的問題。可以使用ConcurrentHashMap來實現(xiàn)線程安全的Map。
紅黑樹是什么?
紅黑樹是一種自平衡的二叉查找樹,可以保證在最壞情況下基本動態(tài)操作的時間復(fù)雜度為O(log n)。紅黑樹中的每個節(jié)點都有一個顏色屬性,可以是紅色或黑色。紅黑樹滿足以下5個性質(zhì):
通過這些性質(zhì),紅黑樹可以保證在插入和刪除節(jié)點時,自動調(diào)整樹的結(jié)構(gòu),以保持樹的平衡和性質(zhì)的滿足。相比于普通的二叉查找樹,紅黑樹的平衡性更好,查找、插入和刪除都具有更穩(wěn)定的時間復(fù)雜度,因此在很多場景下被廣泛應(yīng)用。
什么是公平鎖和非公平鎖?
公平鎖和非公平鎖是針對鎖的獲取方式而言的。
公平鎖是指多個線程按照申請鎖的順序來獲取鎖,即先到先得的原則。當(dāng)線程A釋放鎖后,線程B、C、D依次獲取鎖,如果此時線程E申請鎖,則它需要等待B、C、D依次獲取到鎖并釋放鎖后才能獲取鎖。
非公平鎖是指多個線程獲取鎖的順序是隨機(jī)的,不保證公平性。當(dāng)線程A釋放鎖后,線程B、C、D等線程都可以通過競爭獲取到鎖,而此時線程E也可以通過競爭獲取到鎖。
在實際應(yīng)用中,公平鎖可以避免饑餓現(xiàn)象,但是由于需要維護(hù)線程隊列,因此效率相對較低。而非公平鎖由于不需要維護(hù)線程隊列,因此效率相對較高,但是可能會導(dǎo)致某些線程長時間無法獲取鎖。
ThreadLocal 是什么?
ThreadLocal是Java中的一個線程封閉技術(shù),它可以讓每個線程都擁有自己單獨的變量副本,從而保證線程安全。ThreadLocal提供了一種線程本地存儲的機(jī)制,為每個線程提供一個獨立的變量副本,使得每個線程中的變量互不干擾。
計算機(jī)網(wǎng)絡(luò)
TCP 三次握手、四次揮手的過程?
三次握手的過程:
CLOSE狀態(tài)。先是服務(wù)端主動監(jiān)聽某個端口,處于 LISTEN狀態(tài) client_isn),將此序號置于 TCP 首部的「序號」字段中,同時把 SYN標(biāo)志位置為 1,表示 SYN報文。接著把第一個 SYN 報文發(fā)送給服務(wù)端,表示向服務(wù)端發(fā)起連接,該報文不包含應(yīng)用層數(shù)據(jù),之后客戶端處于 SYN-SENT狀態(tài)。 SYN報文后,首先服務(wù)端也隨機(jī)初始化自己的序號( server_isn),將此序號填入 TCP 首部的「序號」字段中,其次把 TCP 首部的「確認(rèn)應(yīng)答號」字段填入 client_isn + 1, 接著把 SYN和 ACK標(biāo)志位置為 1。最后把該報文發(fā)給客戶端,該報文也不包含應(yīng)用層數(shù)據(jù),之后服務(wù)端處于 SYN-RCVD狀態(tài)。 ACK標(biāo)志位置為 1,其次「確認(rèn)應(yīng)答號」字段填入 server_isn + 1,最后把報文發(fā)送給服務(wù)端,這次報文可以攜帶客戶到服務(wù)端的數(shù)據(jù),之后客戶端處于 ESTABLISHED狀態(tài)。 ESTABLISHED狀態(tài)。 四次揮手的過程:
FIN標(biāo)志位被置為 1的報文,也即 FIN報文,之后客戶端進(jìn)入 FIN_WAIT_1狀態(tài)。 ACK應(yīng)答報文,接著服務(wù)端進(jìn)入 CLOSE_WAIT狀態(tài)。 ACK應(yīng)答報文后,之后進(jìn)入 FIN_WAIT_2狀態(tài)。 FIN報文,之后服務(wù)端進(jìn)入 LAST_ACK狀態(tài)。 FIN報文后,回一個 ACK應(yīng)答報文,之后進(jìn)入 TIME_WAIT狀態(tài) ACK應(yīng)答報文后,就進(jìn)入了 CLOSE狀態(tài),至此服務(wù)端已經(jīng)完成連接的關(guān)閉。 2MSL一段時間后,自動進(jìn)入 CLOSE狀態(tài),至此客戶端也完成連接的關(guān)閉。 為什么要三次握手、四次揮手?
三次握手的原因:
四次次揮手的原因:
LINUX有哪些IO機(jī)制?
阻塞IO(Blocking IO):應(yīng)用程序在進(jìn)行IO操作時,會一直阻塞等待IO完成,期間無法進(jìn)行其他操作。
非阻塞IO(Non-blocking IO):應(yīng)用程序在進(jìn)行IO操作時,會立即返回,無論IO操作是否完成,應(yīng)用程序都可以進(jìn)行其他操作。需要通過輪詢的方式來判斷IO是否完成,因此效率較低。
IO多路復(fù)用(IO Multiplexing):通過select、poll、epoll等系統(tǒng)調(diào)用,在一個進(jìn)程中可以同時監(jiān)控多個文件描述符,當(dāng)有任何一個文件描述符就緒時,就可以進(jìn)行IO操作。
信號驅(qū)動IO(Signal Driven IO):應(yīng)用程序在進(jìn)行IO操作時,向內(nèi)核注冊一個信號處理函數(shù),內(nèi)核在IO完成時會向應(yīng)用程序發(fā)送一個信號,應(yīng)用程序收到信號后再進(jìn)行數(shù)據(jù)處理。
異步IO(Asynchronous IO):應(yīng)用程序進(jìn)行IO操作時,可以立即返回,內(nèi)核負(fù)責(zé)將數(shù)據(jù)讀取到指定的緩沖區(qū)中,并在完成后通知應(yīng)用程序,應(yīng)用程序可以繼續(xù)進(jìn)行其他操作。異步IO需要操作系統(tǒng)和硬件的支持,目前主要應(yīng)用于高性能IO場景。
select poll epoll,底層實現(xiàn)有什么區(qū)別?
select 和 poll 并沒有本質(zhì)區(qū)別,它們內(nèi)部都是使用「線性結(jié)構(gòu)」來存儲進(jìn)程關(guān)注的 Socket 集合。
在使用的時候,首先需要把關(guān)注的 Socket 集合通過 select/poll 系統(tǒng)調(diào)用從用戶態(tài)拷貝到內(nèi)核態(tài),然后由內(nèi)核檢測事件,當(dāng)有網(wǎng)絡(luò)事件產(chǎn)生時,內(nèi)核需要遍歷進(jìn)程關(guān)注 Socket 集合,找到對應(yīng)的 Socket,并設(shè)置其狀態(tài)為可讀/可寫,然后把整個 Socket 集合從內(nèi)核態(tài)拷貝到用戶態(tài),用戶態(tài)還要繼續(xù)遍歷整個 Socket 集合找到可讀/可寫的 Socket,然后對其處理。
很明顯發(fā)現(xiàn),select 和 poll 的缺陷在于,當(dāng)客戶端越多,也就是 Socket 集合越大,Socket 集合的遍歷和拷貝會帶來很大的開銷,因此也很難應(yīng)對 C10K。
epoll 是解決 C10K 問題的利器,通過兩個方面解決了 select/poll 的問題。
BIO 和 NIO 的區(qū)別?
Java中,BIO和NIO都是IO模型,它們的主要區(qū)別在于:
算法
鏈表判斷相交
publicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){if(headA==null||headB==null)returnnull;ListNodepA=headA,pB=headB;while(pA!=pB){pA=pA==null?headB:;pB=pB==null?headA:;}returnpA;}面試總結(jié)
求職者的感覺
非常有收獲的一次面試,值得之后自己單獨寫一寫文章去記錄一下?;A(chǔ)不牢地動山搖,雖然都是基礎(chǔ)問題,但是往下深挖根莖葉脈全部相連,這些問題面試題里面都有解,但是自己真的是只知道表面,淺淺看個大概就上戰(zhàn)場了,還有就是非常感謝面試官,反問環(huán)節(jié)給了我很多建議,包括面試、策略、基礎(chǔ)、算法等等,是一次寶貴的學(xué)習(xí)經(jīng)歷,說不遺憾是假的,但我很開心,有所收獲就好。
求職者的不足之處
基礎(chǔ)不夠扎實,很多只知其表不知其里,而且面試官經(jīng)驗豐富,非常敏銳,當(dāng)時壓力也很大,被問倒了心態(tài)也不穩(wěn),有的可以答出來的也沒想起來怎么說。
沒有幾個答的特別好的,稍微說一點就會被問深直到不會,這里就不貼當(dāng)時回答了,說的都很淺,下來每一個問題都要仔細(xì)研究,要將知識連接成網(wǎng)。
自己給自己構(gòu)造一個場景,順著把用到的技術(shù)全部梳理一遍,能講出這個整體過程,有頭有尾,才能真的理解,比如hashmap插入數(shù)據(jù)的過程、threadlocal創(chuàng)建釋放的過程、String怎么實現(xiàn)的字符串拼接、SpringBoot框架搭建的每一步等等。
歡迎學(xué)編程的朋友們加入魚皮的,和上萬名學(xué)編程的同學(xué)共享知識、交流進(jìn)步,學(xué)習(xí)原創(chuàng)項目并享有答疑指導(dǎo)服務(wù)。
往期推薦
相關(guān)稿件
康乃馨是送給什么人的(康乃馨花語和寓意)-環(huán)球報資訊
【全球新要聞】Soul發(fā)布《2023年輕人搭子社交報告》
每日熱門:文化市集、星空音樂、夜觀昆蟲……綠美白云生態(tài)嘉年華燃情夏夜
三消息:波爾津吉斯加盟綠軍,布朗拒絕球員選項,步行者掘金新交易達(dá)成 今日關(guān)注
當(dāng)前熱議!浙江省養(yǎng)老金調(diào)整方案2023年(最新)將公布,6月還有一筆補(bǔ)貼已發(fā)放?
海信家電(00921)及一系列附屬認(rèn)購合共16.3億元的浦銀理財產(chǎn)品|天天快資訊
新聞聯(lián)播丨成渝地區(qū)雙城經(jīng)濟(jì)圈累計完成重大項目投資超8400億元 天天播報
金力永磁(06680)委任梁敏輝及李曉光為非執(zhí)行董事
6月23~6月30有求必應(yīng),大富大貴,搖直上,財運極佳的生肖
當(dāng)前熱門:紙槍的折法 紙槍的折法可發(fā)子彈,威力大
環(huán)球今頭條!銀川燒烤店爆炸31人死亡,事發(fā)前細(xì)節(jié)公布
自治區(qū)農(nóng)業(yè)農(nóng)村廳召開2022年度國家考核評估反饋問題整改工作布置會議|當(dāng)前看點
全球微頭條丨抖音:無相關(guān)資質(zhì)認(rèn)證用戶 不得使用具有誤導(dǎo)性的資訊類賬號信息
【天天快播報】《中國國家地理》聯(lián)合高德發(fā)布“人生探索計劃” 可實現(xiàn)精品自駕路線一鍵導(dǎo)航
環(huán)球焦點!新加坡樟宜機(jī)場用機(jī)器人警察巡邏,美媒:它們不僅僅是噱頭
國產(chǎn)缺芯少屏問題都被他解決了,京東方之父再次抓住新機(jī)遇 世界速看料


