记录一次腾讯面试经历
騰訊面試定在了晚上七點,并且騰訊會議視頻面試,自己在周三接到的面試邀請,面試官添加了微信聯系定了時間。初定周四,后續因面試官有事改到周五,面試官交流很客氣。
這次面試自己也有問題, 沒有調試好自己的電腦,因此當說到面試過程中如何寫代碼時我就知道需要考察算法代碼的。但是可能面試官也不想再麻煩直接就開始了。
1、自我介紹
自我介紹自己按照工作經歷以及離職原因、所掌握技術棧、工作之余的興趣三個方面說了下。這里面試官問了我第二份工作的地點,如實回答外包。
2、String、StringBuffer、StringBuilder的區別?
這里我介紹了String的final的特性,然后說了StringBuffer是線程安全的,String、StringBuilder是非線程安全的。
3、Java的內存模型
這個問題先前復習過,這里從主內存以及線程的工作內存說了下,另外也說了主內存與工作內存的交互操作,例如Read、Write、Load、Store…實現主內存與工作內存的交互,這里也提了一下volatile的內存屏障。
4、對Synchronized、CAS、volatile有什么認識?大致介紹下?
先說了CAS的問題,CAS說了通過Unsafe類來實現的,Unsafe類中的compareAndSet方法提供CAS特性,并且這是一種樂觀鎖的形式,通過比較與交換實現數據的更改,同時保證線程安全,但是這種線程安全會存在性能問題。
synchronized講了底層的實現通過對象中的監視器來實現,并且對象加鎖標志是通過對象頭中的markword來實現的,每次對markword的對象標志設置加鎖解鎖。同時synchronized可以使用在方法和代碼塊中,使用在方法中是通過monitorenter和monitorexit來實現加鎖、釋放鎖的過程,使用在代碼塊通過ACC_SYNCHRONIZED來實現加鎖標志。并且synchronized還是一個可重入鎖,也就是當一個線程獲取了鎖,當它再次獲取鎖時只需要判斷markword中的當前鎖線程是否是當前線程即可,不需要再進行加鎖的過程,這里也提到了synchronized鎖升級的問題,說了一下鎖從輕量級鎖到重量級鎖的升級,這里忘記了偏向鎖。(補充:首先偏向鎖,偏向鎖在對象中也是通過markword中的一個標志位來實現的,如果一個線程獲取了鎖,在markword中就會存儲該線程的id,當線程再次操作該對象,會判斷偏向的線程是否是當前線程,如果是則不需要再進行加鎖的過程。輕量級鎖而言,既然是輕量級鎖,那么就不能進行線程的阻塞,所以synchronized實現輕量級鎖是通過樂觀鎖的觀念來實現的,如果一個線程獲取不到鎖,不會讓線程阻塞,只會讓線程做自旋操作,如果其它線程釋放了鎖,那么自旋的線程就可以獲取鎖了,但是不能一直讓線程做自旋,這樣會一直占用cpu資源,所以如果自旋十次還獲取不到鎖,那么輕量級鎖就會升級為重量級鎖)
最后講了一下volatile的問題,volatile從可見性和禁止重排序兩個方面講了,可見性方面從數據失效說了下,如果一個線程操作一個共享變量,那么該共享變量在其它線程的工作內存中就失效,需要從主內存中重新獲取。禁止重排序方面從內存屏障說了下,提了下load和store的操作,但是具體的沒有展開說。(當時忘記了!)
5、synchronized鎖優化了解嗎?
這里說了鎖升級的過程,具體的優化偏向鎖、自旋鎖、輕量級鎖、重量級鎖忘記了!當時沒說
6、hashMap、hashTable、concurrentHashMap的區別?
這三個我先說了數據結構,都是key-value的形式,然后說了hashMap是非線程安全的,hashTable、concurrentHashMap是線程安全的,同時hashMap展開說了下里面的擴容時進行rehash的操作,hashMap如何避免rehash的問題,通過擴容后的長度-1和hashcode做與操作,進行判斷是否需要進行rehash。hashTable說了保證線程安全是通過synchronized來實現的,concurrentHashMap說了下自己的理解,保證線程安全是通過對一個桶位加鎖。
7、JVM的垃圾收集器
垃圾收集器里面我說了Serial收集器,是stop the world的形式,需要停止其它工作,直到垃圾收集結束。是通過復制算法實現的。
ParNew收集器,支持多線程,通過復制算法實現的。 CMS收集器,Hotspot虛擬機的默認收集器,通過分代收集算法實現的。
8、redis的跳躍表了解嗎?說下原理?
redis的跳躍表這里我通過自己的理解說了下,我將跳躍表看成一座座大樓,第一座大樓與后續的大樓做了指向,也就是第三層指向第二座大樓,第四層指向第三座大樓,依次類推,最多是32層,并且數據在跳躍表中是升序的,因此當查詢數字3時,可以從第一座樓指向第三座樓的指針可以得到3,而不需要進行遍歷。或者二分法查找,避免了二叉樹時間復雜度會變成O(n)的情況。
9、計算機網絡熟悉嗎?說下TCP、UDP的區別?
這里說了下TCP面向連接的,UDP不面向連接,同時TCP是可靠性傳輸,UDP不是可靠傳輸。
10、那你說一下TCP如何保證可靠傳輸?
這個問題自己回答的不是太好,從說了下擁塞控制、滑動窗口、超時重傳、等待確認機制。其它記得不是很清楚沒說。
11、TCP的粘包了解嗎?說下
沒怎么了解過,后續我可以學習下!
12、LRU的實現原理?
把LRU的get、put方法介紹了一下流程。
13、LRU的數據結構如何設計?
當時忘記了,緊張的要死。
14、說下自己的項目?具體做了哪些東西,從細節上說?
從項目說,然后說了具體做了什么?如何實現的?
說了項目使用的技術棧、以及項目的架構,最后說了自己的做的功能的具體實現,自我感覺這里寫的特別亂。
15、你有什么要問我的嗎?
我:請問公司是做什么業務的? 面試官:xxxxx 我:通過剛才的面試,您覺得我在技術方面哪些還需要提升的?
面試官:說了我計算機網絡方面不熟練,后續要再學習,說我LRU理解不夠透徹,然后說我在項目中并沒有做特別有深度的東西,還需要加深。
整個面試市場37分鐘,我已經知道面試不理想了,因為還沒考代碼就提前結束了面試。整體問的問題都很基礎,但是自己答的還是不太理想,一方面掌握的不夠牢固,另一方面太過緊張,后續再調整,還是很感謝有這樣的機會接受一次面試。
第二天接到了面試不通過的短信,不過也沒什么,再繼續努力,自己欠缺的還是太多,也算是一份經歷。后續繼續加油!
面試官很nice的,首先很客氣,而且給提出后續需要加強的意見,這是很感謝的,只能說能力還不夠,沒什么沮喪和失望的。自信還是有的,再繼續努力吧!
總結
以上是生活随笔為你收集整理的记录一次腾讯面试经历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 视频转码需要权限,and
- 下一篇: 视频文件格式扩展名/专用名词详解