版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025年高頻java實(shí)習(xí)生面試題及答案Java基本數(shù)據(jù)類型有哪些?各占多少字節(jié)?自動(dòng)裝箱和拆箱的原理是什么?Java基本數(shù)據(jù)類型包括8種: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字節(jié)或4字節(jié))。自動(dòng)裝箱是將基本類型轉(zhuǎn)換為對(duì)應(yīng)包裝類(如int→Integer),通過(guò)調(diào)用包裝類的valueOf()方法實(shí)現(xiàn);拆箱是將包裝類轉(zhuǎn)換為基本類型(如Integer→int),通過(guò)調(diào)用xxxValue()方法實(shí)現(xiàn)。例如,Integeri=10(裝箱)等價(jià)于Integeri=Integer.valueOf(10);intj=i(拆箱)等價(jià)于intj=Value()。需注意,Integer.valueOf()對(duì)-128~127的整數(shù)會(huì)緩存,直接返回已有對(duì)象,超出范圍則新建。String、StringBuilder、StringBuffer的區(qū)別是什么?為什么String是不可變的?三者均用于字符串操作。String底層是final修飾的char數(shù)組(JDK9后為byte數(shù)組),不可變,每次修改會(huì)提供新對(duì)象;StringBuilder和StringBuffer底層是可變char數(shù)組(非final)。StringBuffer線程安全(方法用synchronized修飾),StringBuilder非線程安全但性能更高。String不可變的原因:①常量池優(yōu)化:避免重復(fù)創(chuàng)建相同字符串;②線程安全:多線程共享時(shí)無(wú)需額外同步;③哈希緩存:String的hashCode()方法緩存結(jié)果,不可變保證哈希值穩(wěn)定。例如,"abc"會(huì)存儲(chǔ)在字符串常量池中,若修改會(huì)提供新的"abcd",原對(duì)象不變。==和equals()的區(qū)別是什么?重寫equals()為什么需要重寫hashCode()?==對(duì)于基本類型比較值,對(duì)于引用類型比較內(nèi)存地址;equals()是Object的方法,默認(rèn)比較地址,可重寫為值比較(如String重寫equals()比較字符內(nèi)容)。重寫equals()需重寫hashCode()的原因:HashMap等集合依賴hashCode()和equals()確定元素位置,若兩個(gè)對(duì)象equals()相等但hashCode()不同,會(huì)導(dǎo)致它們被存入不同桶,破壞“相等對(duì)象應(yīng)具有相同哈希值”的約定。例如,自定義類User重寫equals()比較name,若不重寫hashCode(),兩個(gè)name相同的User對(duì)象在HashMap中可能分布在不同桶,無(wú)法正確判斷相等。面向?qū)ο蟮娜筇匦允鞘裁??多態(tài)的實(shí)現(xiàn)機(jī)制是什么?三大特性:封裝(隱藏內(nèi)部實(shí)現(xiàn),暴露接口)、繼承(子類繼承父類屬性方法)、多態(tài)(同一行為不同對(duì)象表現(xiàn)不同形態(tài))。多態(tài)的實(shí)現(xiàn)依賴動(dòng)態(tài)綁定(運(yùn)行時(shí)確定方法調(diào)用),需滿足:①繼承或?qū)崿F(xiàn)接口;②重寫父類方法;③父類引用指向子類對(duì)象。例如,父類Animal有eat()方法,子類Cat和Dog重寫eat(),調(diào)用animal.eat()時(shí),根據(jù)實(shí)際對(duì)象類型調(diào)用對(duì)應(yīng)方法,這一過(guò)程由JVM的虛方法表(VirtualMethodTable)實(shí)現(xiàn),子類重寫方法會(huì)覆蓋虛表中父類方法的入口地址。重載(Overload)和重寫(Override)的區(qū)別是什么?編譯期和運(yùn)行期如何確定調(diào)用哪個(gè)方法?重載是同一類中方法名相同、參數(shù)列表不同(類型/順序/個(gè)數(shù)),與返回值無(wú)關(guān);重寫是子類重寫父類方法,方法名、參數(shù)、返回值相同(子類返回值可為父類返回值的子類,即協(xié)變返回),訪問(wèn)權(quán)限不能更嚴(yán)格。重載在編譯期確定(靜態(tài)綁定),根據(jù)參數(shù)類型匹配最接近的方法;重寫在運(yùn)行期確定(動(dòng)態(tài)綁定),根據(jù)實(shí)際對(duì)象類型調(diào)用子類方法。例如,類A有method(inti)和method(Strings),調(diào)用method(1)編譯期匹配int版本;若A是父類,B是子類且重寫method(inti),則Aa=newB()時(shí),a.method(1)運(yùn)行期調(diào)用B的方法。抽象類和接口的區(qū)別是什么?Java8之后接口有哪些新特性?抽象類可包含抽象方法和具體方法、成員變量(可靜態(tài)/非靜態(tài)),子類用extends繼承(單繼承);接口默認(rèn)方法(publicabstract),變量默認(rèn)publicstaticfinal,類用implements實(shí)現(xiàn)(多實(shí)現(xiàn))。Java8后接口支持:①默認(rèn)方法(default修飾,提供方法實(shí)現(xiàn));②靜態(tài)方法(static修飾,可直接調(diào)用);③私有方法(Java9+,供默認(rèn)/靜態(tài)方法調(diào)用)。例如,接口A可定義defaultvoidprint(){System.out.println("A");},實(shí)現(xiàn)類可選擇重寫或直接使用。抽象類更適合定義模板(如HttpServlet定義doGet/doPost模板方法),接口更適合定義行為規(guī)范(如Runnable定義run()行為)。ArrayList和LinkedList的底層數(shù)據(jù)結(jié)構(gòu)是什么?分別適合什么場(chǎng)景?ArrayList底層是動(dòng)態(tài)擴(kuò)容的數(shù)組(Object[]elementData),默認(rèn)初始容量10,擴(kuò)容時(shí)新容量為原1.5倍;LinkedList底層是雙向鏈表(Node節(jié)點(diǎn)包含prev、next、item)。ArrayList隨機(jī)訪問(wèn)(get(i))時(shí)間O(1),但插入/刪除(尤其中間位置)需移動(dòng)元素,時(shí)間O(n);LinkedList插入/刪除(僅需修改前后節(jié)點(diǎn)指針)時(shí)間O(1)(指定位置需遍歷到該節(jié)點(diǎn),時(shí)間O(n)),隨機(jī)訪問(wèn)需遍歷,時(shí)間O(n)。因此,ArrayList適合讀多寫少場(chǎng)景(如數(shù)據(jù)展示),LinkedList適合寫多(頻繁插入刪除)讀少場(chǎng)景(如隊(duì)列、棧)。HashMap的底層實(shí)現(xiàn)是什么?JDK7和JDK8有哪些主要區(qū)別?JDK7中HashMap底層是數(shù)組+鏈表,數(shù)組為Entry[],每個(gè)Entry包含hash、key、value、next(鏈表指針);JDK8改為數(shù)組+鏈表+紅黑樹,數(shù)組為Node[](與Entry結(jié)構(gòu)類似),當(dāng)鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64時(shí),鏈表轉(zhuǎn)換為紅黑樹(TreeNode),查詢時(shí)間從O(n)降至O(logn)。主要區(qū)別:①數(shù)據(jù)結(jié)構(gòu):JDK7鏈表,JDK8鏈表+紅黑樹;②哈希計(jì)算:JDK7用hash()方法二次哈希(h^=k.hashCode();h^=(h>>>20)^(h>>>12);h^=(h>>>7)^(h>>>4);),JDK8簡(jiǎn)化為(h=key.hashCode())^(h>>>16)(高位參與運(yùn)算,減少哈希沖突);③插入方式:JDK7頭插法(新節(jié)點(diǎn)插入鏈表頭部),JDK8尾插法(避免多線程擴(kuò)容時(shí)鏈表成環(huán)導(dǎo)致死循環(huán));④擴(kuò)容時(shí)rehash:JDK7需重新計(jì)算每個(gè)元素的哈希值,JDK8通過(guò)(e.hash&oldCap)判斷元素是否在原位置或原位置+oldCap,無(wú)需重新計(jì)算。HashMap的擴(kuò)容機(jī)制是怎樣的?為什么負(fù)載因子默認(rèn)是0.75?擴(kuò)容觸發(fā)條件:當(dāng)前元素?cái)?shù)量>容量×負(fù)載因子(threshold=capacity×loadFactor)。初始容量默認(rèn)16,負(fù)載因子默認(rèn)0.75。擴(kuò)容時(shí)創(chuàng)建新數(shù)組(容量為原2倍),將原數(shù)組元素重新分配到新數(shù)組(rehash)。負(fù)載因子過(guò)小(如0.5)會(huì)導(dǎo)致頻繁擴(kuò)容,空間利用率低;過(guò)大(如1.0)會(huì)導(dǎo)致鏈表過(guò)長(zhǎng),查詢效率下降。0.75是空間和時(shí)間的權(quán)衡,符合泊松分布(鏈表長(zhǎng)度為8的概率約0.00000006),此時(shí)鏈表轉(zhuǎn)紅黑樹的概率極低,兼顧性能與空間。ConcurrentHashMap如何保證線程安全?JDK7和JDK8的實(shí)現(xiàn)有何不同?JDK7中ConcurrentHashMap使用分段鎖(Segment),繼承ReentrantLock,默認(rèn)16個(gè)Segment,每個(gè)Segment對(duì)應(yīng)一個(gè)哈希表,鎖粒度為Segment(即操作不同Segment的線程可并行)。JDK8放棄分段鎖,改為CAS(Compare-And-Swap)+synchronized:①數(shù)組節(jié)點(diǎn)(Node)用volatile修飾,保證可見性;②插入元素時(shí),若節(jié)點(diǎn)為空,用CAS嘗試插入;③若節(jié)點(diǎn)非空且不為紅黑樹根節(jié)點(diǎn),用synchronized鎖住該節(jié)點(diǎn)(鏈表頭/紅黑樹根),保證同一桶內(nèi)操作的線程安全。JDK8鎖粒度更細(xì)(從Segment到單個(gè)節(jié)點(diǎn)),并發(fā)性能更高,且synchronized經(jīng)優(yōu)化(鎖升級(jí))性能接近Lock。Error和Exception的區(qū)別是什么?Checked異常和Unchecked異常有哪些常見例子?Error表示嚴(yán)重錯(cuò)誤(如OutOfMemoryError、StackOverflowError),由JVM或系統(tǒng)級(jí)問(wèn)題導(dǎo)致,程序無(wú)法恢復(fù);Exception表示可處理的異常(如IOException、NullPointerException)。Exception分為Checked異常(編譯期檢查,需顯式處理)和Unchecked異常(RuntimeException及其子類,編譯期不檢查)。常見Checked異常:IOException、SQLException;常見Unchecked異常:NullPointerException、IllegalArgumentException、ArrayIndexOutOfBoundsException。例如,調(diào)用FileInputStream構(gòu)造方法需處理FileNotFoundException(Checked),而訪問(wèn)null對(duì)象的方法會(huì)拋NullPointerException(Unchecked)。try-with-resources的作用是什么?相比傳統(tǒng)try-finally有什么優(yōu)勢(shì)?try-with-resources用于自動(dòng)關(guān)閉實(shí)現(xiàn)AutoCloseable接口的資源(如文件流、數(shù)據(jù)庫(kù)連接)。資源聲明在try括號(hào)內(nèi),執(zhí)行完try塊后會(huì)自動(dòng)調(diào)用close()方法(無(wú)論是否發(fā)生異常)。相比傳統(tǒng)try-finally,優(yōu)勢(shì):①代碼更簡(jiǎn)潔,無(wú)需手動(dòng)編寫finally塊;②自動(dòng)關(guān)閉順序與聲明順序相反(后聲明的先關(guān)閉),避免資源泄漏;③若try和close()均拋異常,最終異常為try塊中的異常(close()異常被抑制,可通過(guò)getSuppressed()獲?。?。例如:try(FileInputStreamfis=newFileInputStream("test.txt")){//使用fis讀取文件}//fis自動(dòng)關(guān)閉,無(wú)需finally塊finally塊中的代碼一定會(huì)執(zhí)行嗎?如果try或catch中有return,finally的執(zhí)行順序是怎樣的?finally塊通常一定會(huì)執(zhí)行,除非:①調(diào)用System.exit(0);②線程被中斷或終止;③JVM崩潰。若try或catch中有return,finally在return前執(zhí)行(但不會(huì)改變r(jià)eturn的返回值,除非return的是可變對(duì)象)。例如:publicinttest(){inti=1;try{returni;}finally{i=2;}}返回1,因?yàn)閒inally修改的是局部變量i,而return的是i的副本。若返回對(duì)象:publicList<Integer>test(){List<Integer>list=newArrayList<>();list.add(1);try{returnlist;}finally{list.add(2);}}返回[1,2],因?yàn)閒inally修改了list的內(nèi)容(對(duì)象引用未變)。創(chuàng)建線程的方式有哪些?Runnable和Callable的區(qū)別是什么?創(chuàng)建線程的方式:①繼承Thread類(重寫run());②實(shí)現(xiàn)Runnable接口(重寫run(),傳給Thread構(gòu)造);③實(shí)現(xiàn)Callable接口(重寫call(),有返回值,通過(guò)FutureTask獲?。虎苁褂镁€程池(如ExecutorService.submit())。Runnable和Callable的區(qū)別:①Runnable的run()無(wú)返回值,Callable的call()有返回值(泛型V);②run()不能拋受檢異常,call()可拋受檢異常;③Callable需通過(guò)FutureTask包裝,與Thread配合使用(newThread(newFutureTask<>(callable)).start())。線程的生命周期有哪些狀態(tài)?狀態(tài)之間如何轉(zhuǎn)換?Java線程生命周期(Thread.State枚舉):①NEW(新建,未調(diào)用start());②RUNNABLE(可運(yùn)行,包括操作系統(tǒng)的運(yùn)行中(Running)和就緒(Ready)狀態(tài));③BLOCKED(阻塞,等待監(jiān)視器鎖,如synchronized同步塊);④WAITING(無(wú)限等待,調(diào)用wait()、join()無(wú)超時(shí)、LockSupport.park());⑤TIMED_WAITING(超時(shí)等待,調(diào)用sleep(time)、wait(time)、join(time)、LockSupport.parkNanos(time));⑥TERMINATED(終止,run()執(zhí)行完畢或異常終止)。狀態(tài)轉(zhuǎn)換示例:NEW→RUNNABLE(start());RUNNABLE→BLOCKED(進(jìn)入synchronized塊但未獲取鎖);RUNNABLE→TIMED_WAITING(sleep(1000));TIMED_WAITING→RUNNABLE(超時(shí)或被notify());WAITING→RUNNABLE(被notify()或interrupt());RUNNABLE→TERMINATED(run()結(jié)束)。synchronized的底層實(shí)現(xiàn)是什么?鎖升級(jí)的過(guò)程是怎樣的?synchronized的底層通過(guò)JVM的Monitor(監(jiān)視器鎖)實(shí)現(xiàn),依賴操作系統(tǒng)的互斥量(Mutex),但JDK6后引入鎖升級(jí)優(yōu)化。鎖升級(jí)過(guò)程(從低到高):①偏向鎖:記錄第一個(gè)獲取鎖的線程ID,后續(xù)同一線程獲取鎖無(wú)需CAS,僅檢查ID是否匹配(適用于單線程重復(fù)獲取鎖);②輕量級(jí)鎖:若其他線程競(jìng)爭(zhēng),偏向鎖升級(jí)為輕量級(jí)鎖(線程在棧幀中創(chuàng)建LockRecord,用CAS將對(duì)象頭的MarkWord替換為L(zhǎng)ockRecord指針),若CAS失敗則自旋(默認(rèn)10次)嘗試獲取;③重量級(jí)鎖:自旋失敗后升級(jí)為重量級(jí)鎖(依賴操作系統(tǒng)Mutex,線程阻塞,切換成本高)。對(duì)象頭的MarkWord會(huì)記錄鎖狀態(tài)(偏向鎖、輕量級(jí)鎖、重量級(jí)鎖、無(wú)鎖)及相關(guān)信息(如線程ID、鎖計(jì)數(shù)器)。Lock接口相比synchronized有哪些優(yōu)勢(shì)?ReentrantLock的公平鎖和非公平鎖有什么區(qū)別?Lock接口(如ReentrantLock)相比synchronized的優(yōu)勢(shì):①可中斷獲取鎖(lockInterruptibly());②可超時(shí)獲取鎖(tryLock(longtime,TimeUnitunit));③支持多個(gè)條件變量(Condition,可精確喚醒指定線程);④鎖獲取可公平(按等待隊(duì)列順序)。ReentrantLock默認(rèn)非公平鎖(新線程直接嘗試CAS獲取鎖,可能插隊(duì)),公平鎖(嚴(yán)格按等待隊(duì)列順序獲取)。非公平鎖性能更高(減少線程切換),公平鎖避免線程饑餓(但可能降低吞吐量)。例如,公平鎖下所有線程按申請(qǐng)順序獲取鎖,非公平鎖可能后申請(qǐng)的線程先獲?。ㄈ舢?dāng)前鎖剛釋放)。volatile關(guān)鍵字的作用是什么?如何保證可見性和禁止指令重排?volatile的作用:①保證可見性:被volatile修飾的變量,寫操作會(huì)立即刷新到主內(nèi)存,讀操作從主內(nèi)存讀取,避免線程本地緩存導(dǎo)致的臟讀;②禁止指令重排:通過(guò)內(nèi)存屏障(MemoryBarrier)限制編譯器和CPU的重排序,確保代碼執(zhí)行順序符合預(yù)期。JVM通過(guò)在volatile變量讀寫前后插入內(nèi)存屏障實(shí)現(xiàn):寫操作前插入StoreStore屏障(保證前面的寫操作完成),寫后插入StoreLoad屏障(保證寫操作對(duì)其他線程可見);讀操作前插入LoadLoad屏障(保證后面的讀操作使用最新值),讀后插入LoadStore屏障(保證讀操作后寫操作不重排到前面)。例如,volatilebooleanflag=false;線程A修改flag為true后,線程B能立即看到true,且不會(huì)出現(xiàn)“flag已修改但其他變量未刷新”的重排問(wèn)題。線程池的核心參數(shù)有哪些?工作原理是怎樣的?常用的拒絕策略有哪些?線程池(ThreadPoolExecutor)的核心參數(shù):①corePoolSize(核心線程數(shù),保留在線程池中的線程數(shù),即使空閑);②maximumPoolSize(最大線程數(shù),線程池允許的最大線程數(shù));③keepAliveTime(非核心線程空閑存活時(shí)間);④unit(時(shí)間單位);⑤workQueue(任務(wù)隊(duì)列,存放待執(zhí)行任務(wù),如ArrayBlockingQueue、LinkedBlockingQueue);⑥threadFactory(線程工廠,創(chuàng)建線程);⑦h(yuǎn)andler(拒絕策略,任務(wù)無(wú)法處理時(shí)的處理方式)。工作原理:①提交任務(wù),若當(dāng)前線程數(shù)<corePoolSize,創(chuàng)建新線程執(zhí)行;②若≥corePoolSize,任務(wù)存入workQueue;③若workQueue滿且線程數(shù)<maximumPoolSize,創(chuàng)建非核心線程執(zhí)行;④若線程數(shù)≥maximumPoolSize且workQueue滿,觸發(fā)拒絕策略。常用拒絕策略:①AbortPolicy(默認(rèn),拋RejectedExecutionException);②CallerRunsPolicy(調(diào)用者線程執(zhí)行任務(wù));③DiscardPolicy(丟棄任務(wù));④DiscardOldestPolicy(丟棄隊(duì)列中最舊任務(wù),嘗試重新提交當(dāng)前任務(wù))。JVM的內(nèi)存區(qū)域是如何劃分的?堆和棧的主要區(qū)別是什么?JVM內(nèi)存區(qū)域(《Java虛擬機(jī)規(guī)范》定義):①程序計(jì)數(shù)器(ProgramCounterRegister):記錄當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào)(線程私有,唯一無(wú)OOM的區(qū)域);②虛擬機(jī)棧(JavaVirtualMachineStacks):存儲(chǔ)棧幀(局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口),線程私有,每個(gè)方法調(diào)用對(duì)應(yīng)一個(gè)棧幀入棧(線程請(qǐng)求的棧深度超過(guò)限制拋StackOverflowError,擴(kuò)展失敗拋OutOfMemoryError);③本地方法棧(NativeMethodStacks):為本地方法服務(wù)(類似虛擬機(jī)棧,HotSpot與虛擬機(jī)棧合并);④堆(Heap):存放對(duì)象實(shí)例和數(shù)組(線程共享,最大內(nèi)存區(qū)域,OOM主要發(fā)生地);⑤方法區(qū)(MethodArea):存儲(chǔ)類信息、常量、靜態(tài)變量、即時(shí)編譯代碼(線程共享,JDK7前為永久代,JDK8后為元空間(MetaSpace,使用本地內(nèi)存));⑥運(yùn)行時(shí)常量池(RuntimeConstantPool):方法區(qū)的一部分,存儲(chǔ)編譯期提供的常量和符號(hào)引用(JDK7后字符串常量池移至堆)。堆和棧的區(qū)別:①存儲(chǔ)內(nèi)容:堆存對(duì)象和數(shù)組,棧存局部變量(基本類型和對(duì)象引用);②線程共享性:堆共享,棧線程私有;③內(nèi)存管理:堆由GC自動(dòng)回收,棧隨方法調(diào)用/返回自動(dòng)入棧/出棧;④大小限制:堆通常較大(可通過(guò)-Xms/-Xmx設(shè)置),棧較小(默認(rèn)1MB左右,可通過(guò)-Xss設(shè)置)。垃圾回收的常見算法有哪些?分代收集算法是如何結(jié)合這些算法的?常見垃圾回收算法:①標(biāo)記-清除(Mark-Sweep):標(biāo)記存活對(duì)象,清除未標(biāo)記對(duì)象,缺點(diǎn)是產(chǎn)生內(nèi)存碎片;②復(fù)制(Copying):將內(nèi)存分為兩塊,存活對(duì)象復(fù)制到另一塊,清空原塊,缺點(diǎn)是可用內(nèi)存減半;③標(biāo)記-整理(Mark-Compact):標(biāo)記存活對(duì)象,將其向一端移動(dòng),整理后清除邊界外內(nèi)存,避免碎片;④分代收集(GenerationalCollection):根據(jù)對(duì)象存活周期分代,采用不同算法。JVM堆分為新生代(YoungGeneration)和老年代(OldGeneration):①新生代(Eden區(qū)+兩個(gè)Survivor區(qū),默認(rèn)比例8:1:1):對(duì)象存活率低,用復(fù)制算法(Eden+FromSurvivor復(fù)制到ToSurvivor,存活次數(shù)≥閾值(默認(rèn)15)的對(duì)象移到老年代);②老年代:對(duì)象存活率高,用標(biāo)記-清除或標(biāo)記-整理算法(如CMS用標(biāo)記-清除,G1用標(biāo)記-整理+復(fù)制)。常見的垃圾收集器有哪些?CMS和G1的主要區(qū)別是什么?常見收集器(按分代劃分):①新生代收集器:Serial(單線程復(fù)制)、ParNew(多線程復(fù)制,配合CMS)、ParallelScavenge(多線程復(fù)制,目標(biāo)吞吐量);②老年代收集器:SerialOld(單線程標(biāo)記-整理)、ParallelOld(多線程標(biāo)記-整理,配合ParallelScavenge)、CMS(ConcurrentMarkSweep,多線程標(biāo)記-清除);③全收集器:G1(Garbage-First,基于Region劃分,混合收集)、ZGC(低延遲,基于顏色指針和讀屏障)。CMS和G1的區(qū)別:①內(nèi)存劃分:CMS基于分代(新生代+老年代),G1基于Region(將堆劃分為多個(gè)大小相等的Region,部分Region作為Eden/Survivor/Old,還有HumongousRegion存大對(duì)象);②算法:CMS用標(biāo)記-清除(有碎片,可能觸發(fā)FullGC),G1用標(biāo)記-整理+復(fù)制(Region間復(fù)制,減少碎片);③目標(biāo):CMS目標(biāo)低停頓(并發(fā)標(biāo)記/清除),G1目標(biāo)可控停頓(可指定M停頓時(shí)間,優(yōu)先回收垃圾多的Region);④并發(fā)階段:CMS的并發(fā)標(biāo)記可能產(chǎn)生浮動(dòng)垃圾(需預(yù)留空間),G1的并發(fā)標(biāo)記更高效(使用RememberedSet記錄跨Region引用)。類加載的過(guò)程分為哪幾個(gè)階段?雙親委派模型的作用是什么?類加載過(guò)程:①加載(Loading):通過(guò)類加載器將class文件字節(jié)流加載到內(nèi)存,提供Class對(duì)象;②鏈接(Linking):包括驗(yàn)證(校驗(yàn)字節(jié)碼格式)、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并初始化為默認(rèn)值)、解析(將符號(hào)引用轉(zhuǎn)為直接引用);③初始化(Initialization):執(zhí)行類構(gòu)造器<clinit>()方法(靜態(tài)變量賦值和靜態(tài)代碼塊執(zhí)行)。雙親委派模型:類加載器收到加載請(qǐng)求時(shí),先委托父類加載器(非繼承關(guān)系,是組合關(guān)系)加載,父類無(wú)法加載時(shí)再自己加載。作用:①避免重復(fù)加載(同一類由同一加載器加載);②保證安全(核心類如java.lang.Object由啟動(dòng)類加載器加載,防止用戶自定義同名類覆蓋)。例如,自定義java.lang.String類,啟動(dòng)類加載器會(huì)先加載rt.jar中的String,避免惡意替換。BIO、NIO、AIO的區(qū)別是什么?NIO的核心組件有哪些?BIO(BlockingIO):同步阻塞IO,每個(gè)連接對(duì)應(yīng)一個(gè)線程(如傳統(tǒng)Socket編程,accept()、read()阻塞),并發(fā)量低(線程數(shù)限制);NIO(NewIO/Non-BlockingIO):同步非阻塞IO,基于事件驅(qū)動(dòng),一個(gè)線程管理多個(gè)連接(通過(guò)Selector輪詢Channel事件),減少線程數(shù);AIO(AsynchronousIO):異步非阻塞IO,基于回調(diào)或Future,IO操作完成后通知應(yīng)用(如Java7的AsynchronousSocketChannel)。NIO核心組件:①Channel(通道):雙向數(shù)據(jù)傳輸(如FileChannel、SocketChannel),類似流但可異步;②Buffer(緩沖區(qū)):存儲(chǔ)數(shù)據(jù)(如ByteBuffer、CharBuffer),需切換讀寫模式(flip());③Selector(選擇器):管理多個(gè)Channel的事件(連接、讀、寫),線程通過(guò)Selector.select()獲取就緒事件。Buffer的四個(gè)核心屬性是什么?flip()和clear()方法的作用是什么?Buffer的四個(gè)屬性:①capacity(容量,創(chuàng)建時(shí)確定,不可變);②position(當(dāng)前位置,寫模式下為下一個(gè)寫入位置,讀模式下為下一個(gè)讀取位置);③limit(限制,寫模式下為capacity,讀模式下為最后一個(gè)有效數(shù)據(jù)位置);④mark(標(biāo)記,調(diào)用mark()記錄當(dāng)前position,可通過(guò)reset()恢復(fù))。flip()方法:將寫模式轉(zhuǎn)為讀模式(position=0,limit=原position),例如,寫入5個(gè)字節(jié)后,flip()使position=0,limit=5,可讀前5個(gè)字節(jié)。clear()方法:將讀模式轉(zhuǎn)為寫模式(position=0,limit=capacity),但不會(huì)清除數(shù)據(jù)(只是重置指針),新數(shù)據(jù)會(huì)覆蓋舊數(shù)據(jù)(若未讀完)。Spring的IOC是什么?如何通過(guò)IOC降低代碼耦合?IOC(InversionofControl,控制反轉(zhuǎn)):將對(duì)象的創(chuàng)建、依賴管理由程序自身轉(zhuǎn)移到Spring容器,容器負(fù)責(zé)對(duì)象的生命周期和依賴注入(DI,DependencyInjection)。傳統(tǒng)代碼中對(duì)象A依賴對(duì)象B,需A主動(dòng)創(chuàng)建B(newB()),耦合高;IOC下,A只需聲明對(duì)B的依賴(如@Autowired),容器創(chuàng)建B并注入到A中,A無(wú)需關(guān)心B的創(chuàng)建細(xì)節(jié)。例如://傳統(tǒng)方式publicclassA{privateBb=newB();//A直接依賴B的具體實(shí)現(xiàn)}//IOC方式publicclassA{@AutowiredprivateBb;//A依賴B的接口,容器注入具體實(shí)現(xiàn)(如BImpl)}通過(guò)面向接口編程+容器注入,A僅依賴B的接口,B的實(shí)現(xiàn)可替換(如改為BImpl2),無(wú)需修改A的代碼,降低耦合。Spring的AOP是什么?切點(diǎn)、通知、連接點(diǎn)的概念分別是什么?AOP(Aspect-OrientedProgramming,面向切面編程):通過(guò)動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理或CGLIB)將橫切關(guān)注點(diǎn)(如日志、事務(wù)、權(quán)限)與業(yè)務(wù)邏輯分離,避免代碼冗余。相關(guān)概念:①連接點(diǎn)(JoinPoint):程序執(zhí)行的某個(gè)點(diǎn)(如方法調(diào)用、異常拋出);②切點(diǎn)(Pointcut):匹配連接點(diǎn)的表達(dá)式(如execution(com.example.service..(..))),指定哪些方法需要增強(qiáng);③通知(Advice):在切點(diǎn)處執(zhí)行的代碼(如@Before前置通知、@After后置通知、@Around環(huán)繞通知);④切面(Aspect):切點(diǎn)+通知的組合,定義何時(shí)(通知類型)何地(切點(diǎn))做什么(增強(qiáng)邏輯);⑤引入(Introduction):為類添加新方法或?qū)傩裕虎蘅椚耄╓eaving):將切面邏輯插入目標(biāo)對(duì)象的過(guò)程(編譯期、類加載期、運(yùn)行期)。Bean的生命周期包括哪些階段?@PostConstruct和@PreDestroy的作用是什么?Bean的生命周期(在Spring容器中):①實(shí)例化(調(diào)用構(gòu)造方法創(chuàng)建對(duì)象);②屬性注入(DI,設(shè)置依賴的Bean);③初始化前(BeanPostProcessor的postProcessBeforeInitialization(),如@Autowired后處理);④初始化(調(diào)用InitializingBean的afterPropertiesSet()或@PostConstruct修飾的方法);⑤初始化后(BeanPostProcessor的postProcessAfterInitialization(),如AOP提供代理對(duì)象);⑥使用(容器提供Bean供應(yīng)用使用);⑦銷毀前(調(diào)用DisposableBean的destroy()或@PreDestroy修飾的方法);⑧銷毀(容器關(guān)閉時(shí)釋放資源)。@PostConstruct:在依賴注入完成后執(zhí)行初始化邏輯(等價(jià)于InitializingBean);@PreDestroy:在Bean銷毀前執(zhí)行清理邏輯(等價(jià)于DisposableBean)。例如:publicclassMyBean{@PostConstructpublicvoidinit(){//初始化資源(如連接池)}@PreDestroypublicvoiddestroy(){//釋放資源(如關(guān)閉連接)}}@Autowired和@Resource的區(qū)別是什么?依賴注入的方式有哪些?@Autowired(Spring注解)和@Resource(JSR-250注解,Java標(biāo)準(zhǔn))的區(qū)別:①注入依據(jù):@Autowired默認(rèn)按類型(byType),可通過(guò)@Qualifier指定名稱(byName);@Resource默認(rèn)按名稱(byName,name屬性),無(wú)名稱時(shí)按類型(byType);②作用域:@Autowired可用于構(gòu)造器、方法、字段;@Resource主要用于字段和setter方法;③支持的參數(shù):@Autowired有required屬性(默認(rèn)true,未找到Bean拋異常);@Resource有name和type屬性。依賴注入的方式:①字段注入(@AutowiredprivateBb;);②構(gòu)造器注入(publicA(Bb){this.b=b;},推薦,避免循環(huán)依賴和空指針);③setter注入(@AutowiredpublicvoidsetB(Bb){this.b=b;})。聲明式事務(wù)的實(shí)現(xiàn)原理是什么?事務(wù)的傳播行為有哪些?聲明式事務(wù)通過(guò)SpringAOP實(shí)現(xiàn),在方法前后添加事務(wù)管理邏輯(開啟、提交、回滾事務(wù))。核心注解是@Transactional(可標(biāo)注在類或方法上),Spring會(huì)提供代理對(duì)象,攔截方法調(diào)用,根據(jù)配置的隔離級(jí)別和傳播行為管理事務(wù)。事務(wù)的傳播行為(Propagation)定義了方法間調(diào)用時(shí)事務(wù)的邊界:①REQUIRED(默認(rèn)):當(dāng)前有事務(wù)則加入,無(wú)則新建;②SUPPORTS:當(dāng)前有事務(wù)則加入,無(wú)則非事務(wù)執(zhí)行;③MANDATORY:當(dāng)前必須有事務(wù),無(wú)則拋異常;④REQUIRES_NEW:新建事務(wù),當(dāng)前事務(wù)掛起;⑤NOT_SUPPORTED:非事務(wù)執(zhí)行,當(dāng)前事務(wù)掛起;⑥NEVER:非事務(wù)執(zhí)行,當(dāng)前有事務(wù)則拋異常;⑦NESTED:在當(dāng)前事務(wù)的嵌套事
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年池州市市直事業(yè)單位公開招聘工作人員63名參考考試題庫(kù)及答案解析
- 2025貴州省法院系統(tǒng)招聘聘用制書記員282人備考題庫(kù)參考答案詳解
- 2026年西安市浐灞實(shí)驗(yàn)小學(xué)教師招聘?jìng)淇碱}庫(kù)及答案詳解參考
- 2026年甘肅省平?jīng)鍪谐缧趴h機(jī)關(guān)事業(yè)單位選調(diào)工作人員選調(diào)計(jì)劃調(diào)整筆試模擬試題及答案解析
- 2026四川省革命傷殘軍人休養(yǎng)院(四川省第一退役軍人醫(yī)院)第一批招聘編外人員11人備考題庫(kù)及參考答案詳解一套
- 云存儲(chǔ)服務(wù)協(xié)議(2026年數(shù)據(jù)安全)
- 2026廣西防城港市防城中學(xué)招聘高中體育教師1名備考題庫(kù)有完整答案詳解
- 2026年國(guó)際金融風(fēng)險(xiǎn)管理策略與實(shí)踐練習(xí)題
- 2026北京市大興區(qū)中醫(yī)醫(yī)院招聘臨時(shí)輔助用工人員5人備考題庫(kù)及一套完整答案詳解
- 2026年汽車維修技術(shù)發(fā)動(dòng)機(jī)與底盤操作規(guī)范題庫(kù)
- 物業(yè)項(xiàng)目綜合服務(wù)方案
- 2025-2026學(xué)年北京市西城區(qū)初二(上期)期末考試物理試卷(含答案)
- 公路工程施工安全技術(shù)與管理課件 第09講 起重吊裝
- 企業(yè)管理 華為會(huì)議接待全流程手冊(cè)SOP
- 供水企業(yè)制度流程規(guī)范
- 河南省2025年普通高等學(xué)校對(duì)口招收中等職業(yè)學(xué)校畢業(yè)生考試語(yǔ)文試題 答案
- 馬口鐵印鐵制罐工藝流程詳解課件
- 狼蒲松齡原文及翻譯
- 2023初會(huì)職稱《經(jīng)濟(jì)法基礎(chǔ)》習(xí)題庫(kù)及答案
- 預(yù)應(yīng)力管樁-試樁施工方案
- GB/T 3500-1998粉末冶金術(shù)語(yǔ)
評(píng)論
0/150
提交評(píng)論