2025年Java基礎(chǔ)常見(jiàn)面試題及答案_第1頁(yè)
2025年Java基礎(chǔ)常見(jiàn)面試題及答案_第2頁(yè)
2025年Java基礎(chǔ)常見(jiàn)面試題及答案_第3頁(yè)
2025年Java基礎(chǔ)常見(jiàn)面試題及答案_第4頁(yè)
2025年Java基礎(chǔ)常見(jiàn)面試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2025年Java基礎(chǔ)常見(jiàn)面試題及答案Java基礎(chǔ)常見(jiàn)面試題及答案(2025年版)1.基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型的區(qū)別是什么?Java中基本數(shù)據(jù)類(lèi)型包括byte(1字節(jié))、short(2字節(jié))、int(4字節(jié))、long(8字節(jié))、float(4字節(jié))、double(8字節(jié))、char(2字節(jié))、boolean(未明確定義,通常認(rèn)為1位或1字節(jié)),共8種?;緮?shù)據(jù)類(lèi)型變量存儲(chǔ)的是具體數(shù)值,直接存放在虛擬機(jī)棧的局部變量表中;引用數(shù)據(jù)類(lèi)型變量存儲(chǔ)的是對(duì)象的內(nèi)存地址(指向堆中對(duì)象),包括類(lèi)、接口、數(shù)組類(lèi)型?;緮?shù)據(jù)類(lèi)型有默認(rèn)值(如int默認(rèn)0,boolean默認(rèn)false),引用數(shù)據(jù)類(lèi)型默認(rèn)值為null。此外,基本數(shù)據(jù)類(lèi)型無(wú)法調(diào)用方法(除包裝類(lèi)提供的靜態(tài)方法),而引用數(shù)據(jù)類(lèi)型可以調(diào)用對(duì)象方法。2.String、StringBuilder、StringBuffer的區(qū)別是什么?String是不可變類(lèi),底層使用final修飾的char數(shù)組(JDK9后改為byte數(shù)組)存儲(chǔ)字符,每次對(duì)String的修改操作(如拼接)都會(huì)提供新的String對(duì)象,適合少量字符串操作。StringBuilder和StringBuffer是可變類(lèi),底層數(shù)組可擴(kuò)容,拼接操作直接在原對(duì)象上修改,性能更高。StringBuilder是非線程安全的(方法無(wú)synchronized修飾),適用于單線程環(huán)境;StringBuffer是線程安全的(方法用synchronized修飾),適用于多線程環(huán)境。三者的性能排序通常為:StringBuilder>StringBuffer>String(大量拼接時(shí))。3.==和equals()的區(qū)別是什么?==對(duì)于基本數(shù)據(jù)類(lèi)型比較的是數(shù)值是否相等;對(duì)于引用數(shù)據(jù)類(lèi)型比較的是內(nèi)存地址是否相同(是否指向同一個(gè)對(duì)象)。equals()是Object類(lèi)的方法,默認(rèn)實(shí)現(xiàn)等價(jià)于==(比較地址),但可被重寫(xiě)。常見(jiàn)類(lèi)如String、Integer等重寫(xiě)了equals()方法,使其比較內(nèi)容是否相等。例如,newString("abc").equals("abc")返回true(內(nèi)容相同),但==返回false(地址不同)。需注意,重寫(xiě)equals()時(shí)需同時(shí)重寫(xiě)hashCode(),以保證哈希集合(如HashMap)的正確性。4.抽象類(lèi)和接口的區(qū)別有哪些?抽象類(lèi)使用abstract修飾,可包含抽象方法(無(wú)方法體)和具體方法(有方法體)、構(gòu)造方法、成員變量(可靜態(tài)/非靜態(tài));接口使用interface修飾,JDK8前只能有抽象方法和靜態(tài)常量(publicstaticfinal),JDK8后支持默認(rèn)方法(default)和靜態(tài)方法,JDK9后支持私有方法。類(lèi)只能繼承一個(gè)抽象類(lèi),但可實(shí)現(xiàn)多個(gè)接口。抽象類(lèi)體現(xiàn)“is-a”關(guān)系(如動(dòng)物抽象類(lèi),貓是動(dòng)物),接口體現(xiàn)“can-do”關(guān)系(如飛行接口,鳥(niǎo)可以飛行)。抽象類(lèi)的設(shè)計(jì)目的是代碼復(fù)用(提供通用實(shí)現(xiàn)),接口的設(shè)計(jì)目的是定義行為規(guī)范(解耦)。5.重載(Overload)和重寫(xiě)(Override)的區(qū)別是什么?重載發(fā)生在同一個(gè)類(lèi)中,指多個(gè)方法具有相同方法名但不同參數(shù)列表(參數(shù)類(lèi)型、數(shù)量或順序不同),與返回值類(lèi)型、訪問(wèn)修飾符無(wú)關(guān)。例如:publicvoidprint(inta)和publicvoidprint(Stringb)是重載。重寫(xiě)發(fā)生在子類(lèi)和父類(lèi)之間,子類(lèi)重新定義父類(lèi)的非靜態(tài)、非final、非private方法,要求方法名、參數(shù)列表、返回值類(lèi)型(或其子類(lèi)型,協(xié)變返回)完全相同,訪問(wèn)修飾符不能比父類(lèi)更嚴(yán)格(如父類(lèi)是protected,子類(lèi)可以是public但不能是private)。重寫(xiě)體現(xiàn)多態(tài)特性,運(yùn)行時(shí)根據(jù)對(duì)象實(shí)際類(lèi)型調(diào)用方法;重載是編譯時(shí)多態(tài),根據(jù)參數(shù)類(lèi)型決定調(diào)用哪個(gè)方法。6.說(shuō)說(shuō)HashMap的底層實(shí)現(xiàn)和擴(kuò)容機(jī)制?JDK7及之前HashMap底層是數(shù)組+鏈表結(jié)構(gòu),數(shù)組作為哈希表(table),每個(gè)數(shù)組元素是鏈表頭節(jié)點(diǎn)(Entry)。JDK8優(yōu)化為數(shù)組+鏈表+紅黑樹(shù)結(jié)構(gòu),當(dāng)鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64時(shí),鏈表轉(zhuǎn)換為紅黑樹(shù)(樹(shù)化);當(dāng)樹(shù)的大小≤6時(shí),紅黑樹(shù)退化為鏈表(反樹(shù)化)。這樣設(shè)計(jì)是因?yàn)殒湵黹L(zhǎng)度超過(guò)8時(shí),查詢(xún)時(shí)間復(fù)雜度從O(n)變?yōu)镺(logn)(紅黑樹(shù)),提升性能(根據(jù)泊松分布,鏈表長(zhǎng)度為8的概率僅約0.00000006,樹(shù)化是小概率優(yōu)化)。HashMap的擴(kuò)容機(jī)制:初始容量為16(DEFAULT_INITIAL_CAPACITY),負(fù)載因子默認(rèn)0.75(DEFAULT_LOAD_FACTOR)。當(dāng)元素?cái)?shù)量(size)超過(guò)threshold(容量×負(fù)載因子)時(shí)觸發(fā)擴(kuò)容,新容量為原容量的2倍(保證是2的冪次,便于哈希計(jì)算)。擴(kuò)容時(shí)需要重新計(jì)算每個(gè)元素的哈希位置(JDK7使用rehash,JDK8通過(guò)(e.hash&oldCap)判斷是否需要移動(dòng),若結(jié)果為0則位置不變,否則位置=原位置+舊容量,減少哈希沖突)。JDK7擴(kuò)容時(shí)采用頭插法(可能導(dǎo)致多線程下鏈表成環(huán)),JDK8改為尾插法(避免環(huán),但仍非線程安全)。7.為什么HashMap的容量是2的冪次?主要與哈希值的計(jì)算和分布有關(guān)。HashMap通過(guò)(n-1)&hash計(jì)算元素在數(shù)組中的位置(n為容量),當(dāng)n是2的冪次時(shí),n-1的二進(jìn)制是全1(如16-1=15→1111),此時(shí)&運(yùn)算等價(jià)于取模運(yùn)算(hash%n),但位運(yùn)算更快。若n不是2的冪次,n-1的二進(jìn)制會(huì)有0位,導(dǎo)致某些哈希值無(wú)法映射到數(shù)組的所有位置(如n=10,n-1=9→1001,hash&9的結(jié)果只能是0,1,4,5,8,9,浪費(fèi)空間且哈希沖突概率增加)。因此,容量設(shè)計(jì)為2的冪次可保證哈希值分布更均勻,減少?zèng)_突。8.ConcurrentHashMap如何保證線程安全?JDK7和JDK8的實(shí)現(xiàn)有何不同?JDK7中ConcurrentHashMap使用分段鎖(Segment)機(jī)制,繼承ReentrantLock,默認(rèn)分為16個(gè)Segment(并發(fā)級(jí)別),每個(gè)Segment對(duì)應(yīng)一個(gè)子哈希表(HashEntry數(shù)組)。操作時(shí)僅鎖定對(duì)應(yīng)的Segment,不同Segment可并行操作,提升并發(fā)效率。但鎖粒度較粗(以Segment為單位),并發(fā)度受限于Segment數(shù)量。JDK8中放棄分段鎖,采用CAS(Compare-And-Swap)+synchronized鎖節(jié)點(diǎn)(Node)的方式。底層結(jié)構(gòu)與HashMap類(lèi)似(數(shù)組+鏈表+紅黑樹(shù)),當(dāng)插入元素時(shí),首先通過(guò)CAS嘗試插入,若失敗則對(duì)該位置的頭節(jié)點(diǎn)加synchronized鎖(鎖的是鏈表或紅黑樹(shù)的根節(jié)點(diǎn)),僅鎖定當(dāng)前桶,鎖粒度更細(xì)(以節(jié)點(diǎn)為單位),并發(fā)性能更高。此外,JDK8的ConcurrentHashMap優(yōu)化了擴(kuò)容機(jī)制(支持多線程協(xié)助擴(kuò)容),通過(guò)sizeCtl變量控制擴(kuò)容狀態(tài),減少擴(kuò)容時(shí)的鎖競(jìng)爭(zhēng)。9.深拷貝和淺拷貝的區(qū)別是什么?如何實(shí)現(xiàn)深拷貝?淺拷貝(ShallowCopy):創(chuàng)建一個(gè)新對(duì)象,新對(duì)象的基本數(shù)據(jù)類(lèi)型屬性與原對(duì)象相同;引用數(shù)據(jù)類(lèi)型屬性指向原對(duì)象中的同一內(nèi)存地址(即共享對(duì)象)。修改原對(duì)象的引用屬性?xún)?nèi)容會(huì)影響新對(duì)象。例如,通過(guò)Object.clone()方法實(shí)現(xiàn)的默認(rèn)克隆是淺拷貝(需類(lèi)實(shí)現(xiàn)Cloneable接口)。深拷貝(DeepCopy):創(chuàng)建一個(gè)新對(duì)象,新對(duì)象的所有屬性(包括基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型)都與原對(duì)象完全獨(dú)立,修改原對(duì)象的任何屬性都不會(huì)影響新對(duì)象。實(shí)現(xiàn)方式包括:①遞歸手動(dòng)拷貝所有引用屬性(如每個(gè)引用類(lèi)型屬性也實(shí)現(xiàn)深拷貝);②使用序列化和反序列化(如通過(guò)ObjectOutputStream和ObjectInputStream,將對(duì)象寫(xiě)入流再讀出,自動(dòng)提供新對(duì)象);③使用第三方庫(kù)(如ApacheCommonsLang的SerializationUtils,或Jackson的JSON序列化)。10.異常處理中,finally塊是否一定會(huì)執(zhí)行?什么情況下不執(zhí)行?通常情況下,finally塊中的代碼在try或catch塊執(zhí)行完成后一定會(huì)執(zhí)行(即使try/catch中有return語(yǔ)句),用于釋放資源(如關(guān)閉文件、連接)。但以下情況finally塊不會(huì)執(zhí)行:①程序在try/catch塊中調(diào)用System.exit(n)退出(n≠0時(shí)終止JVM);②線程在try/catch塊中被中斷或終止;③發(fā)生OutOfMemoryError等無(wú)法處理的錯(cuò)誤導(dǎo)致JVM崩潰;④finally塊所在的線程死亡。注意:若try塊中有return語(yǔ)句,finally塊在return前執(zhí)行,但不會(huì)改變返回值(除非return的是引用類(lèi)型且finally修改其屬性)。例如:```javapublicinttest(){inta=1;try{returna;}finally{a=2;//不影響返回值,最終返回1}}```11.線程的生命周期有哪些狀態(tài)?如何轉(zhuǎn)換?Java線程的狀態(tài)由Thread.State枚舉定義,共6種:-NEW(新建):線程被創(chuàng)建但未調(diào)用start()方法。-RUNNABLE(可運(yùn)行):調(diào)用start()后進(jìn)入,包括操作系統(tǒng)的“就緒”(等待CPU調(diào)度)和“運(yùn)行中”狀態(tài)。-BLOCKED(阻塞):線程等待獲取synchronized同步鎖時(shí)進(jìn)入此狀態(tài)(如競(jìng)爭(zhēng)鎖失?。?。-WAITING(無(wú)限等待):調(diào)用Object.wait()、Thread.join()(無(wú)超時(shí))或LockSupport.park()后進(jìn)入,需其他線程調(diào)用Object.notify()/notifyAll()或LockSupport.unpark()喚醒。-TIMED_WAITING(超時(shí)等待):調(diào)用Thread.sleep(long)、Object.wait(long)、Thread.join(long)或LockSupport.parkNanos()/parkUntil()后進(jìn)入,超時(shí)或被喚醒后轉(zhuǎn)為RUNNABLE。-TERMINATED(終止):線程執(zhí)行完run()方法或因異常終止。狀態(tài)轉(zhuǎn)換示例:NEW→start()→RUNNABLE→競(jìng)爭(zhēng)鎖失敗→BLOCKED→獲得鎖→RUNNABLE→調(diào)用wait()→WAITING→被notify()→RUNNABLE→調(diào)用sleep(1000)→TIMED_WAITING→超時(shí)→RUNNABLE→執(zhí)行完畢→TERMINATED。12.synchronized的底層實(shí)現(xiàn)原理是什么?鎖升級(jí)過(guò)程是怎樣的?synchronized是JVM層面的鎖,依賴(lài)對(duì)象頭中的MarkWord實(shí)現(xiàn)。對(duì)象頭包含哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志等信息。JDK6引入鎖升級(jí)(鎖膨脹)機(jī)制,優(yōu)化性能,鎖狀態(tài)從低到高依次為:-偏向鎖(BiasedLock):默認(rèn)開(kāi)啟,適用于單線程重復(fù)獲取同一鎖的場(chǎng)景。MarkWord存儲(chǔ)當(dāng)前線程ID,后續(xù)該線程加鎖時(shí)無(wú)需CAS操作(檢查線程ID是否匹配),僅需一次CAS記錄線程ID。若其他線程嘗試獲取鎖,偏向鎖升級(jí)為輕量級(jí)鎖。-輕量級(jí)鎖(LightweightLock):線程在棧幀中創(chuàng)建鎖記錄(LockRecord),存儲(chǔ)對(duì)象頭的MarkWord拷貝。通過(guò)CAS嘗試將對(duì)象頭的MarkWord指向鎖記錄,成功則獲取鎖;失敗則說(shuō)明存在競(jìng)爭(zhēng),升級(jí)為重量級(jí)鎖。-重量級(jí)鎖(HeavyweightLock):依賴(lài)操作系統(tǒng)的互斥量(Mutex),未獲取鎖的線程進(jìn)入阻塞狀態(tài)(需內(nèi)核態(tài)切換,開(kāi)銷(xiāo)大)。鎖升級(jí)是單向的(只能從低到高),不可降級(jí)(但在特定條件下,如批量重偏向/撤銷(xiāo)時(shí)可能重置)。synchronized修飾方法時(shí),通過(guò)方法表中的ACC_SYNCHRONIZED標(biāo)志位實(shí)現(xiàn);修飾代碼塊時(shí),通過(guò)monitorenter和monitorexit字節(jié)碼指令實(shí)現(xiàn)(每個(gè)對(duì)象關(guān)聯(lián)一個(gè)監(jiān)視器鎖,monitor的owner字段記錄當(dāng)前持有鎖的線程)。13.說(shuō)說(shuō)volatile的作用和原理?volatile是輕量級(jí)的同步機(jī)制,保證變量的可見(jiàn)性和禁止指令重排序,但不保證原子性??梢?jiàn)性:當(dāng)一個(gè)線程修改了volatile變量的值,JVM會(huì)強(qiáng)制將該變量的修改立即刷新到主內(nèi)存,并使其他線程的工作內(nèi)存中該變量的副本失效(通過(guò)MESI緩存一致性協(xié)議),確保其他線程讀取時(shí)直接從主內(nèi)存獲取最新值。禁止指令重排序:JVM通過(guò)插入內(nèi)存屏障(MemoryBarrier)限制編譯器和CPU的指令重排。具體來(lái)說(shuō),對(duì)volatile變量的寫(xiě)操作前插入StoreStore屏障(保證前面的寫(xiě)操作先于volatile寫(xiě)完成),寫(xiě)操作后插入StoreLoad屏障(保證volatile寫(xiě)先于后面的讀操作完成);讀操作前插入LoadLoad屏障(保證volatile讀先于前面的讀操作完成),讀操作后插入LoadStore屏障(保證volatile讀先于后面的寫(xiě)操作完成)。典型應(yīng)用場(chǎng)景:狀態(tài)標(biāo)志(如volatilebooleanflag=false,用于線程間通信)、單例模式的雙重檢查鎖定(DCL,防止指令重排導(dǎo)致其他線程獲取未初始化的對(duì)象)。14.線程池的核心參數(shù)有哪些?拒絕策略有哪些?線程池通過(guò)ThreadPoolExecutor創(chuàng)建,核心參數(shù)包括:-corePoolSize(核心線程數(shù)):線程池長(zhǎng)期保留的線程數(shù)(即使空閑也不銷(xiāo)毀,除非設(shè)置allowCoreThreadTimeOut為true)。-maximumPoolSize(最大線程數(shù)):線程池允許的最大線程數(shù)(核心線程數(shù)+臨時(shí)線程數(shù))。-keepAliveTime(存活時(shí)間):臨時(shí)線程(超過(guò)核心線程數(shù)的部分)在空閑時(shí)的存活時(shí)間,超時(shí)后銷(xiāo)毀。-unit(時(shí)間單位):keepAliveTime的單位(如TimeUnit.SECONDS)。-workQueue(任務(wù)隊(duì)列):存儲(chǔ)待執(zhí)行任務(wù)的阻塞隊(duì)列,常見(jiàn)類(lèi)型有ArrayBlockingQueue(有界)、LinkedBlockingQueue(無(wú)界/有界)、SynchronousQueue(無(wú)存儲(chǔ),直接提交)、PriorityBlockingQueue(優(yōu)先隊(duì)列)。-threadFactory(線程工廠):創(chuàng)建線程的工廠,可自定義線程名稱(chēng)、優(yōu)先級(jí)等。-handler(拒絕策略):當(dāng)任務(wù)隊(duì)列已滿且線程數(shù)達(dá)到maximumPoolSize時(shí),對(duì)新任務(wù)的處理策略。JDK提供的拒絕策略有4種:-AbortPolicy(默認(rèn)):拋出RejectedExecutionException異常。-CallerRunsPolicy:由調(diào)用者線程(提交任務(wù)的線程)直接執(zhí)行任務(wù)。-DiscardPolicy:靜默丟棄新任務(wù),不做任何處理。-DiscardOldestPolicy:丟棄任務(wù)隊(duì)列中最舊的任務(wù)(隊(duì)首),然后嘗試重新提交新任務(wù)。15.JVM的內(nèi)存區(qū)域是如何劃分的?各區(qū)域的作用是什么?JVM內(nèi)存區(qū)域分為線程私有和線程共享兩部分:線程私有區(qū)域(每個(gè)線程獨(dú)立擁有):-程序計(jì)數(shù)器(ProgramCounterRegister):記錄當(dāng)前線程執(zhí)行的字節(jié)碼指令地址(分支、循環(huán)、跳轉(zhuǎn)、異常處理等需要)。唯一不會(huì)拋出OutOfMemoryError的區(qū)域。-虛擬機(jī)棧(JavaVirtualMachineStack):存儲(chǔ)棧幀(每個(gè)方法調(diào)用對(duì)應(yīng)一個(gè)棧幀),包含局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。若線程請(qǐng)求的棧深度超過(guò)最大值,拋出StackOverflowError;若??蓜?dòng)態(tài)擴(kuò)展但內(nèi)存不足,拋出OutOfMemoryError。-本地方法棧(NativeMethodStack):與虛擬機(jī)棧類(lèi)似,用于執(zhí)行本地方法(如用C/C++實(shí)現(xiàn)的方法)。HotSpot虛擬機(jī)將其與虛擬機(jī)棧合并。線程共享區(qū)域:-堆(Heap):JVM中最大的內(nèi)存區(qū)域,存儲(chǔ)對(duì)象實(shí)例和數(shù)組。所有線程共享,是GC的主要區(qū)域。若堆內(nèi)存不足,拋出OutOfMemoryError(Javaheapspace)。-方法區(qū)(MethodArea):存儲(chǔ)類(lèi)信息(如類(lèi)名、字段、方法、接口)、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等。JDK7前稱(chēng)為“永久代”(PermGen),使用堆的一部分;JDK8后改為“元空間”(Metaspace),使用本地內(nèi)存(NativeMemory),避免永久代的內(nèi)存溢出問(wèn)題。常量池(運(yùn)行時(shí)常量池)是方法區(qū)的一部分,存儲(chǔ)編譯期提供的字面量和符號(hào)引用。此外,直接內(nèi)存(DirectMemory)不屬于JVM規(guī)范中的內(nèi)存區(qū)域,通過(guò)Unsafe類(lèi)或NIO的ByteBuffer.allocateDirect()分配,直接操作堆外內(nèi)存,可減少I(mǎi)O拷貝次數(shù)(零拷貝),但需手動(dòng)管理,否則可能導(dǎo)致OutOfMemoryError(Directbuffermemory)。16.類(lèi)加載的過(guò)程分為哪幾個(gè)階段?各階段的任務(wù)是什么?類(lèi)加載過(guò)程(ClassLoading)分為5個(gè)階段:-加載(Loading):通過(guò)類(lèi)加載器(ClassLoader)將類(lèi)的字節(jié)碼文件(.class)加載到內(nèi)存,提供對(duì)應(yīng)的Class對(duì)象。字節(jié)碼來(lái)源可以是本地文件、網(wǎng)絡(luò)、動(dòng)態(tài)提供(如動(dòng)態(tài)代理)等。-驗(yàn)證(Verification):確保加載的字節(jié)碼符合JVM規(guī)范,防止惡意代碼。包括文件格式驗(yàn)證(如魔數(shù)0xCAFEBABE是否正確)、元數(shù)據(jù)驗(yàn)證(如父類(lèi)是否存在)、字節(jié)碼驗(yàn)證(如操作數(shù)棧類(lèi)型匹配)、符號(hào)引用驗(yàn)證(如符號(hào)引用是否可解析為實(shí)際引用)。-準(zhǔn)備(Preparation):為類(lèi)的靜態(tài)變量(static)分配內(nèi)存并設(shè)置初始值(如int類(lèi)型初始為0,引用類(lèi)型初始為null)。靜態(tài)常量(staticfinal)在編譯時(shí)確定值,準(zhǔn)備階段直接賦值(如staticfinalintA=10,準(zhǔn)備階段A=10)。-解析(Resolution):將符號(hào)引用(如類(lèi)名、方法名的字符串表示)替換為直接引用(內(nèi)存地址或句柄)。解析可能發(fā)生在類(lèi)加載時(shí)(靜態(tài)解析),也可能在運(yùn)行時(shí)(動(dòng)態(tài)解析,如調(diào)用接口方法時(shí))。-初始化(Initialization):執(zhí)行類(lèi)的初始化代碼(static{}靜態(tài)代碼塊和靜態(tài)變量的顯式賦值)。初始化是類(lèi)加載的最后一步,遵循“懶加載”原則(僅當(dāng)類(lèi)被主動(dòng)使用時(shí)觸發(fā),如創(chuàng)建實(shí)例、調(diào)用靜態(tài)方法、反射獲取類(lèi)等)。父類(lèi)先于子類(lèi)初始化,接口初始化不要求父接口先初始化(除非使用父接口的靜態(tài)變量)。17.什么是雙親委派模型?有什么作用?如何打破?雙親委派模型(ParentDelegationModel)是類(lèi)加載器的工作機(jī)制:當(dāng)一個(gè)類(lèi)加載器需要加載類(lèi)時(shí),首先委托給父類(lèi)加載器(非繼承關(guān)系,是組合關(guān)系)加載,父類(lèi)加載器再繼續(xù)向上委托,直到啟動(dòng)類(lèi)加載器(BootstrapClassLoader)。若父類(lèi)加載器無(wú)法加載(未找到對(duì)應(yīng)的.class文件),則由當(dāng)前類(lèi)加載器自己加載。作用:①避免類(lèi)的重復(fù)加載(父類(lèi)已加載則子類(lèi)無(wú)需重復(fù)加載);②保證核心類(lèi)的安全(如java.lang包中的類(lèi)只能由啟動(dòng)類(lèi)加載器加載,防止用戶自定義同名類(lèi)覆蓋核心類(lèi))。打破雙親委派的場(chǎng)景:①熱部署(如Tomcat的WebappClassLoader,每個(gè)Web應(yīng)用有獨(dú)立的類(lèi)加載器,優(yōu)先加載自己的類(lèi),再委托父類(lèi));②動(dòng)態(tài)代理(如Java的SPI機(jī)制,ServiceLoader通過(guò)線程上下文類(lèi)加載器加載實(shí)現(xiàn)類(lèi),打破父類(lèi)加載器的限制);③自定義類(lèi)加載器(重寫(xiě)loadClass()方法,先自己加載再委托父類(lèi))。例如,Tomcat為隔離不同Web應(yīng)用的類(lèi),每個(gè)應(yīng)用使用獨(dú)立的類(lèi)加載器,加載順序?yàn)椋合葯z查本地緩存→本地目錄→父類(lèi)加載器(共享庫(kù))→啟動(dòng)類(lèi)加載器,打破了傳統(tǒng)的雙親委派順序。18.BIO、NIO、AIO的區(qū)別是什么?NIO的核心組件有哪些?BIO(BlockingIO):同步阻塞IO,每個(gè)連接需要一個(gè)獨(dú)立線程處理(如傳統(tǒng)的Socket編程)??蛻舳诉B接時(shí),服務(wù)端創(chuàng)建新線程處理讀寫(xiě)操作,線程阻塞在read()或write()方法,適用于連接數(shù)少且傳輸數(shù)據(jù)量大的場(chǎng)景(如文件傳輸),但線程資源消耗大,并發(fā)能力低。NIO(Non-BlockingIO):同步非阻塞IO,JDK1.4引入?;谑录?qū)動(dòng),通過(guò)Selector(選擇器)監(jiān)控多個(gè)Channel(通道)的事件(如讀、寫(xiě)、連接),一個(gè)線程可管理多個(gè)連接。線程僅在事件觸發(fā)時(shí)處理,否則阻塞在Selector的select()方法(可設(shè)置超時(shí))。適用于連接數(shù)多但短連接的場(chǎng)景(如即時(shí)通訊)。AIO(AsynchronousIO):異步非阻塞IO,JDK1.7引入(NIO.2)。基于回調(diào)機(jī)制,線程發(fā)起IO操作后立即返回,IO完成時(shí)通過(guò)回調(diào)函數(shù)通知線程處理結(jié)果。適用于連接數(shù)多且長(zhǎng)連接的場(chǎng)景(如數(shù)據(jù)庫(kù)連接池)。NIO的核心組件:-Channel(通道):雙向的、可異步讀寫(xiě)的數(shù)據(jù)流(類(lèi)似BIO的Stream,但更靈活),常見(jiàn)實(shí)現(xiàn)有FileChannel(文件)、SocketChannel(客戶端TCP)、ServerSocketChannel(服務(wù)端TCP)、DatagramChannel(UDP)。-Buffer(緩沖區(qū)):存儲(chǔ)數(shù)據(jù)的容器,支持讀寫(xiě)模式切換(通過(guò)flip()方法)。常見(jiàn)Buffer類(lèi)型有ByteBuffer、CharBuffer、IntBuffer等,其中ByteBuffer是最常用的(網(wǎng)絡(luò)傳輸以字節(jié)為單位)。Buffer的四個(gè)核心屬性:capacity(容量,固定)、limit(可操作的上限)、position(當(dāng)前操作位置)、mark(標(biāo)記位置,用于reset()恢復(fù))。-Selector(選擇器):管理多個(gè)Channel的事件,線程通過(guò)Selector.select()獲取就緒事件(如OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT),實(shí)現(xiàn)單線程管理多連接。19.反射的作用是什么?如何通過(guò)反射獲取類(lèi)的方法?反射(Reflection)是Java的動(dòng)態(tài)特性之一,允許程序在運(yùn)行時(shí)獲取類(lèi)的信息(如類(lèi)名、字段、方法)、創(chuàng)建對(duì)象、調(diào)用方法或修改字段值。常見(jiàn)應(yīng)用場(chǎng)景:框架(如Spring的依賴(lài)注入、MyBatis的ORM映射)、動(dòng)態(tài)代理(如JDK動(dòng)態(tài)代理)、單元測(cè)試(訪問(wèn)私有方法/字段)等。通過(guò)反射獲取類(lèi)的方法步驟:①獲取Class對(duì)象:Class<?>clazz=Class.forName("com.example.User");或User.class或user.getClass()。②獲取方法:-getMethods():獲取所有public方法(包括父類(lèi))。-getDeclaredMethods():獲取當(dāng)前類(lèi)聲明的所有方法(包括private,不包括父類(lèi))。-getMethod(Stringname,Class<?>...parameterTypes):根據(jù)方法名和參數(shù)類(lèi)型獲取public方法(包括父類(lèi))。-getDeclaredMethod(Stringname,Class<?>...pa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論