對于想從事java的朋友來說,都會遇到j(luò)ava面試題的問題,其中也包括了java后端面試題,長沙中公優(yōu)就業(yè)java培訓(xùn)機(jī)構(gòu)的小編為大家整理了java后端面試題部分參考,希望對大家能夠有所幫助。
1、ThreadLocal(線程變量副本)
Synchronized實(shí)現(xiàn)內(nèi)存共享,ThreadLocal為每個線程維護(hù)一個本地變量。
采用空間換時間,它用于線程間的數(shù)據(jù)隔離,為每一個使用該變量的線程提供一個副本,每個線程都可以獨(dú)立地改變自己的副本,而不會和其他線程的副本沖突。
ThreadLocal類中維護(hù)一個Map,用于存儲每一個線程的變量副本,Map中元素的鍵為線程對象,而值為對應(yīng)線程的變量副本。
ThreadLocal在Spring中發(fā)揮著巨大的作用,在管理Request作用域中的Bean、事務(wù)管理、任務(wù)調(diào)度、AOP等模塊都出現(xiàn)了它的身影。
Spring中絕大部分Bean都可以聲明成Singleton作用域,采用ThreadLocal進(jìn)行封裝,因此有狀態(tài)的Bean就能夠以singleton的方式在多線程中正常工作了。
2、Java內(nèi)存模型:
Java虛擬機(jī)規(guī)范中將Java運(yùn)行時數(shù)據(jù)分為六種。
(1)程序計數(shù)器:是一個數(shù)據(jù)結(jié)構(gòu),用于保存當(dāng)前正常執(zhí)行的程序的內(nèi)存地址。Java虛擬機(jī)的多線程就是通過線程輪流切換并分配處理器時間來實(shí)現(xiàn)的,為了線程切換后能恢復(fù)到正確的位置,每條線程都需要一個獨(dú)立的程序計數(shù)器,互不影響,該區(qū)域?yàn)?ldquo;線程私有”。
(2)Java虛擬機(jī)棧:線程私有的,與線程生命周期相同,用于存儲局部變量表,操作棧,方法返回值。局部變量表放著基本數(shù)據(jù)類型,還有對象的引用。
(3)本地方法棧:跟虛擬機(jī)棧很像,不過它是為虛擬機(jī)使用到的Native方法服務(wù)。
(4)Java堆:所有線程共享的一塊內(nèi)存區(qū)域,對象實(shí)例幾乎都在這分配內(nèi)存。
(5)方法區(qū):各個線程共享的區(qū)域,儲存虛擬機(jī)加載的類信息,常量,靜態(tài)變量,編譯后的代碼。
(6)運(yùn)行時常量池:代表運(yùn)行時每個class文件中的常量表。包括幾種常量:編譯時的數(shù)字常量、方法或者域的引用。
3、類加載器工作機(jī)制:
(1)裝載:將Java二進(jìn)制代碼導(dǎo)入jvm中,生成Class文件。
(2)連接:a)校驗(yàn):檢查載入Class文件數(shù)據(jù)的正確性 b)準(zhǔn)備:給類的靜態(tài)變量分配存儲空間 c)解析:將符號引用轉(zhuǎn)成直接引用
(3)初始化:對類的靜態(tài)變量,靜態(tài)方法和靜態(tài)代碼塊執(zhí)行初始化工作。
雙親委派模型:類加載器收到類加載請求,首先將請求委派給父類加載器完成
用戶自定義加載器->應(yīng)用程序加載器->擴(kuò)展類加載器->啟動類加載器。
4、SpringMVC運(yùn)行原理
(1)客戶端請求提交到DispatcherServlet
(2)由DispatcherServlet控制器查詢HandlerMapping,找到并分發(fā)到指定的Controller中。
(3)Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView
(4)DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖
(5)視圖負(fù)責(zé)將結(jié)果顯示到客戶端
5、HashMap與HashTable的區(qū)別
(1)HashMap是非線程安全的,HashTable是線程安全的。
(2)HashMap的鍵和值都允許有null值存在,而HashTable則不行。
(3)因?yàn)榫€程安全的問題,HashMap效率比HashTable的要高。
6、HashMap的實(shí)現(xiàn)機(jī)制:
(1)維護(hù)一個每個元素是一個鏈表的數(shù)組,而且鏈表中的每個節(jié)點(diǎn)是一個Entry[]鍵值對的數(shù)據(jù)結(jié)構(gòu)。
(2)實(shí)現(xiàn)了數(shù)組+鏈表的特性,查找快,插入刪除也快。
(3)對于每個key,他對應(yīng)的數(shù)組索引下標(biāo)是 int i = hash(key.hashcode)&(len-1);
(4)每個新加入的節(jié)點(diǎn)放在鏈表首,然后該新加入的節(jié)點(diǎn)指向原鏈表首
以上就是長沙中公優(yōu)就業(yè)java培訓(xùn)機(jī)構(gòu)的小編針對“java后端面試題部分參考”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時為你服務(wù)。
Java面試題