Java基礎(chǔ)部分面試題(2025年)附答案_第1頁
Java基礎(chǔ)部分面試題(2025年)附答案_第2頁
Java基礎(chǔ)部分面試題(2025年)附答案_第3頁
Java基礎(chǔ)部分面試題(2025年)附答案_第4頁
Java基礎(chǔ)部分面試題(2025年)附答案_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Java基礎(chǔ)部分面試題(2025年)附答案1.自動(dòng)裝箱與拆箱的底層實(shí)現(xiàn)是什么?Integer的緩存機(jī)制有哪些需要注意的細(xì)節(jié)?自動(dòng)裝箱通過調(diào)用包裝類的`valueOf()`方法實(shí)現(xiàn),例如`Integeri=10`會(huì)編譯為`Integeri=Integer.valueOf(10)`;拆箱通過調(diào)用`intValue()`方法實(shí)現(xiàn),例如`intj=i`會(huì)編譯為`intj=Value()`。Integer的緩存機(jī)制通過`IntegerCache`靜態(tài)內(nèi)部類實(shí)現(xiàn),默認(rèn)緩存范圍是-128到127(可通過JVM參數(shù)`-XX:AutoBoxCacheMax`調(diào)整上限)。當(dāng)數(shù)值在此范圍內(nèi)時(shí),`valueOf()`會(huì)直接返回緩存的對(duì)象,超出范圍則新建對(duì)象。需要注意:-緩存僅適用于自動(dòng)裝箱和顯式調(diào)用`valueOf()`,`newInteger()`始終創(chuàng)建新對(duì)象;-不同包裝類的緩存范圍不同(如Byte緩存-128~127,Long緩存-128~127,Character緩存0~127);-緩存是線程安全的,因?yàn)閌IntegerCache`類在類加載時(shí)初始化,由類加載機(jī)制保證線程安全。2.Java中方法參數(shù)傳遞是值傳遞還是引用傳遞?對(duì)象作為參數(shù)傳遞時(shí),修改屬性和重新賦值有何區(qū)別?Java中只有值傳遞?;绢愋蛡鬟f的是值的副本,對(duì)象類型傳遞的是對(duì)象引用的副本。當(dāng)對(duì)象作為參數(shù)傳遞時(shí):-修改對(duì)象的屬性會(huì)影響原對(duì)象(因?yàn)橐酶北局赶蛲粚?duì)象);-對(duì)參數(shù)引用重新賦值(如`obj=newObject()`)不會(huì)影響原引用(因?yàn)楦北局赶蛄诵聦?duì)象,原引用仍指向舊對(duì)象)。示例:```javapublicstaticvoidchangeValue(intx){x=10;}//基本類型,調(diào)用后原變量不變publicstaticvoidchangeRef(MyClassobj){obj.setValue(10);}//修改屬性,原對(duì)象屬性改變publicstaticvoidchangeRef2(MyClassobj){obj=newMyClass();}//重新賦值,原引用不變```3.String、StringBuilder、StringBuffer的區(qū)別及適用場景?JDK9之后String的底層存儲(chǔ)有何變化?-String:不可變字符序列,底層使用`finalchar[]`存儲(chǔ)(JDK9前),JDK9后改為`finalbyte[]`(LATIN1或UTF16編碼,節(jié)省空間)。所有修改操作(如`concat()`、`substring()`)都會(huì)提供新對(duì)象。-StringBuffer:可變字符序列,線程安全(方法用`synchronized`修飾),適用于多線程下的頻繁拼接。-StringBuilder:可變字符序列,線程不安全,性能更高,適用于單線程下的頻繁拼接。JDK9優(yōu)化String底層為`byte[]`的原因:多數(shù)字符串僅包含ASCII字符(1字節(jié)),用`char[]`(2字節(jié))存儲(chǔ)浪費(fèi)空間,改為`byte[]`并通過`coder`字段記錄編碼(0為LATIN1,1為UTF16),減少內(nèi)存占用。4.重寫(Override)與重載(Overload)的核心區(qū)別是什么?構(gòu)造方法能否被重寫或重載?-重寫:子類重新定義父類的非靜態(tài)、非final、非private方法,要求方法名、參數(shù)列表、返回值類型(或協(xié)變返回類型)完全相同,訪問權(quán)限不能嚴(yán)于父類。用于實(shí)現(xiàn)多態(tài)。-重載:同一類中方法名相同但參數(shù)列表(類型、順序、個(gè)數(shù))不同,與返回值類型無關(guān)。用于提供多種調(diào)用方式。構(gòu)造方法可以重載(通過不同參數(shù)列表定義多個(gè)構(gòu)造方法),但不能重寫(構(gòu)造方法屬于類自身,子類無法繼承父類構(gòu)造方法)。5.抽象類與接口的區(qū)別(JDK8及以上)?SealedClasses(密封類)如何限制繼承?-抽象類:可包含抽象方法、具體方法、成員變量(非靜態(tài)/靜態(tài)),子類通過`extends`繼承,只能單繼承。-接口:JDK8前僅能定義抽象方法和靜態(tài)常量;JDK8后支持默認(rèn)方法(`default`)和靜態(tài)方法;JDK9后支持私有方法。子類通過`implements`實(shí)現(xiàn),可多實(shí)現(xiàn)。SealedClasses(JDK17引入)通過`sealed`修飾類,并使用`permits`指定允許繼承的子類,限制類的繼承范圍。例如:```javapublicabstractsealedclassShapepermitsCircle,Rectangle{}finalclassCircleextendsShape{}//必須是final或sealed```6.簡述Java異常處理機(jī)制中CheckedException和UncheckedException的分類及處理要求?try-with-resources的原理是什么?-CheckedException(受檢異常):繼承自`Exception`(非`RuntimeException`),如`IOException`、`SQLException`。必須顯式處理(捕獲或聲明拋出),否則編譯失敗。-UncheckedException(非受檢異常):繼承自`RuntimeException`或`Error`,如`NullPointerException`、`ArrayIndexOutOfBoundsException`。無需顯式處理,由JVM或上層調(diào)用者處理。try-with-resources(JDK7引入)用于自動(dòng)關(guān)閉實(shí)現(xiàn)`AutoCloseable`接口的資源(如`FileInputStream`)。原理是編譯器自動(dòng)提供`finally`塊,按資源聲明逆序調(diào)用`close()`方法(即使發(fā)生異常)。資源對(duì)象需在`try`括號(hào)內(nèi)聲明,作用域僅限于`try`塊。7.ArrayList與LinkedList的底層結(jié)構(gòu)和性能差異?為什么ArrayList的`add(intindex,Eelement)`在中間插入時(shí)效率較低?-ArrayList:底層是動(dòng)態(tài)擴(kuò)容的數(shù)組(`transientObject[]elementData`),支持O(1)時(shí)間隨機(jī)訪問(通過索引),但插入/刪除(尤其中間位置)需移動(dòng)元素,時(shí)間復(fù)雜度O(n)。-LinkedList:底層是雙向鏈表(`Node`節(jié)點(diǎn)包含prev、next、item),插入/刪除(已知節(jié)點(diǎn)位置)時(shí)間復(fù)雜度O(1),但隨機(jī)訪問需遍歷鏈表,時(shí)間復(fù)雜度O(n)。ArrayList中間插入時(shí),需將`index`后所有元素后移(`System.arraycopy()`),移動(dòng)次數(shù)為`size-index`,因此當(dāng)`index`接近0時(shí)性能最差(需移動(dòng)全部元素)。8.HashMap的底層結(jié)構(gòu)(JDK8+)?為什么容量是2的冪次?紅黑樹轉(zhuǎn)換的閾值為什么是8?JDK8+HashMap底層是“數(shù)組+鏈表+紅黑樹”結(jié)構(gòu):-數(shù)組(`Node[]table`):存儲(chǔ)鏈表或紅黑樹的頭節(jié)點(diǎn),初始容量16(`DEFAULT_INITIAL_CAPACITY`),負(fù)載因子0.75(平衡空間與查詢效率)。-鏈表:當(dāng)桶中節(jié)點(diǎn)數(shù)≤7時(shí)(`TREEIFY_THRESHOLD`為8,但轉(zhuǎn)換紅黑樹還需容量≥64),以鏈表形式存儲(chǔ)(`Node`節(jié)點(diǎn))。-紅黑樹:當(dāng)桶中節(jié)點(diǎn)數(shù)≥8且容量≥64時(shí),鏈表轉(zhuǎn)換為紅黑樹(`TreeNode`節(jié)點(diǎn)),降低查找時(shí)間復(fù)雜度至O(logn)。容量設(shè)計(jì)為2的冪次是為了通過位運(yùn)算快速計(jì)算哈希桶位置(`(n-1)&hash`),比取模運(yùn)算更高效。若容量非2的冪次,`n-1`的二進(jìn)制位不全為1,會(huì)導(dǎo)致哈希碰撞概率增加。紅黑樹轉(zhuǎn)換閾值設(shè)為8的原因:鏈表節(jié)點(diǎn)數(shù)符合泊松分布,當(dāng)負(fù)載因子0.75時(shí),節(jié)點(diǎn)數(shù)≥8的概率極低(約0.00000006),此時(shí)轉(zhuǎn)換紅黑樹可避免鏈表過長導(dǎo)致的查詢性能下降;而閾值設(shè)為8可平衡鏈表和紅黑樹的維護(hù)成本(紅黑樹插入/刪除的旋轉(zhuǎn)操作比鏈表復(fù)雜)。9.ConcurrentHashMap如何實(shí)現(xiàn)線程安全(JDK7vsJDK8)?put()方法的執(zhí)行流程(JDK8)?JDK7:使用分段鎖(`Segment`數(shù)組,繼承`ReentrantLock`),每個(gè)`Segment`管理一個(gè)鏈表,默認(rèn)16個(gè)段,支持16個(gè)線程并發(fā)寫(不同段)。JDK8:放棄分段鎖,采用`CAS+synchronized`實(shí)現(xiàn)線程安全:-數(shù)組節(jié)點(diǎn)(`Node`)用`volatile`修飾,保證可見性;-插入時(shí),若桶為空(`tab[i]==null`),通過CAS嘗試寫入;-若桶不為空且頭節(jié)點(diǎn)未被鎖定(`f.hash!=MOVED`),使用`synchronized`鎖定頭節(jié)點(diǎn)(鏈表頭或紅黑樹根),避免鎖定整個(gè)桶;-擴(kuò)容時(shí)通過`ForwardingNode`標(biāo)記正在遷移的桶,其他線程協(xié)助擴(kuò)容(`helpTransfer()`)。JDK8put()流程:1.計(jì)算key的哈希值(`hash=key.hashCode()^(hash>>>16)`);2.檢查數(shù)組是否初始化,未初始化則調(diào)用`initTable()`(CAS+自旋保證線程安全);3.計(jì)算桶位置`i=(n-1)&hash`,若桶為空,CAS插入新節(jié)點(diǎn);4.若桶頭節(jié)點(diǎn)哈希為`-1`(`MOVED`),說明正在擴(kuò)容,協(xié)助擴(kuò)容;5.否則,`synchronized`鎖定頭節(jié)點(diǎn),遍歷鏈表/紅黑樹:-鏈表:查找是否存在相同key,存在則覆蓋值;不存在則添加至鏈表尾部(JDK8鏈表尾插),若長度≥8且容量≥64,轉(zhuǎn)換為紅黑樹;-紅黑樹:調(diào)用`putTreeVal()`插入節(jié)點(diǎn);6.增加`size`計(jì)數(shù)(通過`CounterCell`數(shù)組分散計(jì)數(shù),避免CAS競爭),若超過閾值(`sizeCtl`)則擴(kuò)容。10.線程的生命周期有哪些狀態(tài)?如何從RUNNABLE轉(zhuǎn)換為BLOCKED?Java線程狀態(tài)(`Thread.State`枚舉):-NEW:線程創(chuàng)建但未調(diào)用`start()`;-RUNNABLE:可運(yùn)行狀態(tài)(包括正在CPU執(zhí)行或等待調(diào)度);-BLOCKED:等待獲取監(jiān)視器鎖(如進(jìn)入`synchronized`同步塊/方法時(shí)未獲取到鎖);-WAITING:等待其他線程喚醒(調(diào)用`wait()`、`join()`無超時(shí)、`LockSupport.park()`);-TIMED_WAITING:定時(shí)等待(`sleep(long)`、`wait(long)`、`join(long)`、`parkNanos()`);-TERMINATED:線程執(zhí)行完畢或異常終止。從RUNNABLE到BLOCKED的場景:當(dāng)線程嘗試進(jìn)入`synchronized`修飾的代碼塊/方法時(shí),若該鎖已被其他線程持有,則線程狀態(tài)變?yōu)锽LOCKED,直到獲取到鎖。11.synchronized的鎖升級(jí)過程(偏向鎖→輕量級(jí)鎖→重量級(jí)鎖)是怎樣的?鎖的存儲(chǔ)位置在哪里?鎖升級(jí)是為了優(yōu)化鎖的性能,減少線程切換開銷,過程如下:-偏向鎖(JDK6默認(rèn)開啟):首次獲取鎖時(shí),JVM在對(duì)象頭(MarkWord)中記錄當(dāng)前線程ID,后續(xù)同一線程再次獲取鎖時(shí)無需CAS操作,只需檢查線程ID是否匹配。若其他線程競爭鎖,偏向鎖撤銷(升級(jí)為輕量級(jí)鎖)。-輕量級(jí)鎖:競爭線程通過CAS嘗試將對(duì)象頭的MarkWord替換為指向自己棧中鎖記錄的指針。若成功,獲取輕量級(jí)鎖;若失?。ù嬖诟偁帲?,升級(jí)為重量級(jí)鎖。-重量級(jí)鎖:依賴操作系統(tǒng)互斥量(Mutex),競爭線程進(jìn)入阻塞狀態(tài),需內(nèi)核態(tài)切換,開銷大。鎖的信息存儲(chǔ)在對(duì)象頭中,對(duì)象頭包含MarkWord(存儲(chǔ)哈希碼、GC分代年齡、鎖狀態(tài)等)和類型指針(指向類元數(shù)據(jù))。數(shù)組對(duì)象還包含長度信息。12.volatile的作用是什么?如何保證可見性和禁止指令重排?volatile的兩大特性:-可見性:保證被修飾變量的修改對(duì)所有線程可見。JVM通過在寫操作后插入`StoreStore`屏障,讀操作前插入`LoadLoad`屏障,確保變量修改后立即刷新到主內(nèi)存,其他線程讀取時(shí)從主內(nèi)存獲取最新值。-禁止指令重排:通過內(nèi)存屏障限制編譯器和CPU的重排序。寫操作后插入`StoreLoad`屏障,讀操作前插入`LoadStore`屏障,確保volatile變量的操作順序不被重排。示例:單例模式雙重檢查鎖定(DCL)中,`instance`需用volatile修飾,避免指令重排導(dǎo)致其他線程獲取到未初始化的對(duì)象(`newSingleton()`可分為分配內(nèi)存、初始化對(duì)象、設(shè)置引用三步,重排可能導(dǎo)致第二步未完成時(shí)第三步先執(zhí)行)。13.線程池的核心參數(shù)有哪些?拒絕策略有哪幾種?如何合理配置線程數(shù)?線程池(`ThreadPoolExecutor`)核心參數(shù):-`corePoolSize`:核心線程數(shù)(即使空閑也保留的線程數(shù));-`maximumPoolSize`:最大線程數(shù)(核心線程+臨時(shí)線程);-`keepAliveTime`:臨時(shí)線程空閑存活時(shí)間;-`unit`:存活時(shí)間單位;-`workQueue`:任務(wù)隊(duì)列(存儲(chǔ)待執(zhí)行的任務(wù));-`threadFactory`:線程工廠(創(chuàng)建工作線程);-`handler`:拒絕策略(任務(wù)隊(duì)列和線程池均滿時(shí)的處理方式)。拒絕策略(`RejectedExecutionHandler`實(shí)現(xiàn)類):-`AbortPolicy`(默認(rèn)):拋出`RejectedExecutionException`;-`CallerRunsPolicy`:調(diào)用者線程執(zhí)行任務(wù);-`DiscardPolicy`:直接丟棄任務(wù);-`DiscardOldestPolicy`:丟棄隊(duì)列中最舊的任務(wù),嘗試重新提交當(dāng)前任務(wù)。線程數(shù)配置參考:-CPU密集型:線程數(shù)≈CPU核心數(shù)(+1防止頁缺失);-IO密集型:線程數(shù)≈CPU核心數(shù)×(1+平均等待時(shí)間/平均執(zhí)行時(shí)間)(可通過監(jiān)控工具統(tǒng)計(jì)等待時(shí)間與執(zhí)行時(shí)間的比值);-混合任務(wù):拆分任務(wù)類型,或通過壓測確定最優(yōu)值。14.BIO、NIO、AIO的區(qū)別?NIO的Buffer有哪些核心屬性?-BIO(阻塞IO):線程發(fā)起IO操作后阻塞,直到完成(如`ServerSocket.accept()`),適用于連接數(shù)少且固定的場景。-NIO(非阻塞IO,JDK1.4引入):基于事件驅(qū)動(dòng),通過`Selector`監(jiān)控多個(gè)`Channel`的IO事件(讀、寫、連接、接收),線程僅在事件觸發(fā)時(shí)處理,適用于高并發(fā)、短連接場景。-AIO(異步IO,JDK7引入):IO操作由OS完成后回調(diào)通知線程(`CompletionHandler`),真正的異步非阻塞,適用于長連接、大文件傳輸場景。NIOBuffer核心屬性(`java.nio.Buffer`):-`capacity`:緩沖區(qū)容量(固定,創(chuàng)建時(shí)指定);-`position`:當(dāng)前操作位置(讀/寫的起始點(diǎn));-`limit`:可操作的上限(讀模式下為寫操作的position,寫模式下為capacity);-`mark`:標(biāo)記位置(通過`mark()`記錄,`reset()`恢復(fù))。狀態(tài)轉(zhuǎn)換:寫模式→讀模式時(shí)調(diào)用`flip()`(`limit=position;position=0`);讀模式→寫模式時(shí)調(diào)用`clear()`(`position=0;limit=capacity`)或`compact()`(保留未讀數(shù)據(jù),`position=未讀數(shù)據(jù)長度;limit=capacity`)。15.JVM內(nèi)存區(qū)域如何劃分?堆和棧的主要區(qū)別?JVM內(nèi)存區(qū)域(JDK8+):-程序計(jì)數(shù)器:記錄當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào),線程私有,唯一無OOM的區(qū)域。-虛擬機(jī)棧:存儲(chǔ)棧幀(局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口),線程私有,棧深度過深拋出`StackOverflowError`,擴(kuò)展失敗拋出`OutOfMemoryError`(OOM)。-本地方法棧:與虛擬機(jī)棧類似,服務(wù)于本地方法(`native`方法),HotSpot與虛擬機(jī)棧合并。-堆(Heap):存放對(duì)象實(shí)例和數(shù)組,線程共享,是GC的主要區(qū)域,內(nèi)存不足拋出OOM。-元空間(MetaSpace,JDK8取代永久代):存儲(chǔ)類元數(shù)據(jù)、常量、靜態(tài)變量(JDK7起字符串常量池移至堆),使用本地內(nèi)存(NativeMemory),默認(rèn)無固定大小限制,內(nèi)存不足拋出OOM。堆與棧的區(qū)別:-存儲(chǔ)內(nèi)容:堆存對(duì)象實(shí)例,棧存局部變量(基本類型值、對(duì)象引用);-線程屬性:堆是線程共享的,棧是線程私有的;-內(nèi)存管理:堆由GC自動(dòng)回收,棧隨方法調(diào)用/返回自動(dòng)入棧/出棧;-大小限制:堆通常較大(受JVM參數(shù)`-Xmx`限制),棧較小(受`-Xss`限制)。16.垃圾回收(GC)的標(biāo)記階段如何判斷對(duì)象是否存活?分代收集理論的核心假設(shè)是什么?標(biāo)記階段判斷對(duì)象存活的方法:-引用計(jì)數(shù)法:給對(duì)象添加引用計(jì)數(shù)器,引用時(shí)+1,失效時(shí)-1,計(jì)數(shù)器為0則回收。無法解決循環(huán)引用問題(如A引用B,B引用A,無其他引用時(shí)計(jì)數(shù)器均不為0),HotSpot未采用。-可達(dá)性分析(根搜索算法):以GCRoots為起點(diǎn),通過引用鏈(ReferenceChain)遍歷對(duì)象,不可達(dá)的對(duì)象標(biāo)記為可回收。GCRoots包括:-虛擬機(jī)棧中局部變量表引用的對(duì)象;-方法區(qū)中類靜態(tài)屬性引用的對(duì)象;-方法區(qū)中常量引用的對(duì)象

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論