版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高頻java計(jì)算機(jī)面試試題及答案Java的跨平臺(tái)特性如何實(shí)現(xiàn)?Java程序的跨平臺(tái)依賴于Java虛擬機(jī)(JVM)。開發(fā)者編寫的Java源代碼(.java文件)會(huì)被編譯器編譯為與平臺(tái)無關(guān)的字節(jié)碼(.class文件),字節(jié)碼不直接運(yùn)行在操作系統(tǒng)上,而是由對(duì)應(yīng)平臺(tái)的JVM負(fù)責(zé)解析執(zhí)行。不同操作系統(tǒng)需要安裝不同版本的JVM,但字節(jié)碼文件在任何支持JVM的平臺(tái)上都能運(yùn)行,因此實(shí)現(xiàn)了“一次編寫,到處運(yùn)行”。需注意,跨平臺(tái)的是字節(jié)碼而非JVM本身,JVM是平臺(tái)相關(guān)的。JDK與JRE的核心區(qū)別是什么?JDK(JavaDevelopmentKit)是Java開發(fā)工具包,包含JRE(JavaRuntimeEnvironment)、編譯器(javac)、調(diào)試工具(jdb)、文檔提供工具(javadoc)等開發(fā)所需的工具。JRE是Java運(yùn)行時(shí)環(huán)境,包含JVM、核心類庫(如java.lang、java.util)和運(yùn)行Java程序所需的支持文件,但不包含開發(fā)工具。簡(jiǎn)而言之,開發(fā)Java程序需要JDK,運(yùn)行已編譯的Java程序僅需JRE?;緮?shù)據(jù)類型有哪些?各自的字節(jié)長(zhǎng)度是多少?Java有8種基本數(shù)據(jù)類型:整數(shù)型:byte(1字節(jié))、short(2字節(jié))、int(4字節(jié))、long(8字節(jié))浮點(diǎn)型:float(4字節(jié))、double(8字節(jié))字符型:char(2字節(jié),Unicode編碼)布爾型:boolean(規(guī)范未明確定義字節(jié)長(zhǎng)度,實(shí)際實(shí)現(xiàn)中通常為1字節(jié)或4字節(jié))自動(dòng)裝箱與拆箱的原理是什么?可能引發(fā)哪些問題?自動(dòng)裝箱是將基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)的包裝類(如int→Integer),拆箱則是反向操作(如Integer→int)。這一過程由編譯器自動(dòng)完成,本質(zhì)是調(diào)用包裝類的valueOf()方法(裝箱)和xxxValue()方法(拆箱)。常見問題:1.空指針異常:若包裝類對(duì)象為null,拆箱時(shí)會(huì)拋出NullPointerException。2.性能損耗:頻繁裝箱拆箱會(huì)創(chuàng)建額外對(duì)象,增加GC壓力(如循環(huán)中使用Integer累加)。3.數(shù)值比較陷阱:包裝類的“==”比較的是對(duì)象地址,而非數(shù)值。例如,Integera=127;Integerb=127時(shí)a==b可能為true(緩存優(yōu)化),但a=128;b=128時(shí)a==b為false。String、StringBuilder、StringBuffer的區(qū)別及使用場(chǎng)景?String是不可變類,內(nèi)部通過final修飾的char數(shù)組存儲(chǔ)字符(JDK9后改為byte數(shù)組)。每次對(duì)String的修改操作(如拼接、替換)都會(huì)提供新的String對(duì)象,適用于字符串不頻繁修改的場(chǎng)景。StringBuilder是可變類,內(nèi)部使用普通char數(shù)組存儲(chǔ),無同步修飾,線程不安全,性能較高,適用于單線程下的頻繁字符串操作(如循環(huán)拼接)。StringBuffer與StringBuilder類似,但方法使用synchronized修飾,線程安全,性能略低于StringBuilder,適用于多線程下的字符串操作(如共享字符串緩沖區(qū))。面向?qū)ο蟮娜筇匦允鞘裁???qǐng)?jiān)敿?xì)解釋多態(tài)的實(shí)現(xiàn)方式。三大特性為封裝、繼承、多態(tài)。封裝:通過訪問修飾符(private、protected、public)限制屬性和方法的訪問范圍,隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),僅暴露必要接口。繼承:子類通過extends關(guān)鍵字繼承父類的屬性和方法(除private成員),支持代碼復(fù)用,Java不支持多繼承但支持接口多實(shí)現(xiàn)。多態(tài):同一行為在不同對(duì)象上表現(xiàn)出不同形態(tài)。實(shí)現(xiàn)方式有兩種:1.編譯時(shí)多態(tài)(靜態(tài)多態(tài)):通過方法重載(Overload)實(shí)現(xiàn),即同一類中方法名相同但參數(shù)列表不同(參數(shù)類型、個(gè)數(shù)或順序)。2.運(yùn)行時(shí)多態(tài)(動(dòng)態(tài)多態(tài)):通過方法重寫(Override)和向上轉(zhuǎn)型實(shí)現(xiàn)。子類重寫父類的方法,父類引用指向子類對(duì)象時(shí),調(diào)用重寫方法會(huì)執(zhí)行子類實(shí)現(xiàn)。例如:```javaclassAnimal{publicvoidsound(){System.out.println("Animalsound");}}classDogextendsAnimal{@Overridepublicvoidsound(){System.out.println("Woof");}}publicstaticvoidmain(String[]args){Animala=newDog();//向上轉(zhuǎn)型a.sound();//輸出"Woof",運(yùn)行時(shí)綁定子類方法}```抽象類與接口的區(qū)別是什么?抽象類(abstractclass):可包含抽象方法(無方法體)和具體方法??啥x成員變量(靜態(tài)/非靜態(tài))、構(gòu)造方法(用于子類初始化)。子類通過extends繼承,僅能繼承一個(gè)抽象類。接口(interface):所有方法默認(rèn)是publicabstract(JDK8前),JDK8后支持default和static方法。成員變量默認(rèn)是publicstaticfinal(常量)。子類通過implements實(shí)現(xiàn),可實(shí)現(xiàn)多個(gè)接口。設(shè)計(jì)定位:抽象類用于定義“是什么”(IS-A關(guān)系),如Animal抽象類定義動(dòng)物的共同特征;接口用于定義“能做什么”(HAS-A關(guān)系),如Flyable接口定義飛行能力。HashMap的底層結(jié)構(gòu)是怎樣的?JDK1.8做了哪些優(yōu)化?JDK1.7中,HashMap底層是“數(shù)組+鏈表”結(jié)構(gòu)。數(shù)組作為哈希表的桶(bucket),每個(gè)桶存儲(chǔ)一個(gè)鏈表節(jié)點(diǎn)(Entry),節(jié)點(diǎn)包含key、value、hash和next指針。插入元素時(shí),通過key的hashCode()計(jì)算哈希值,再通過(n-1)&hash(n為數(shù)組長(zhǎng)度)確定桶的位置;若發(fā)生哈希沖突(不同key映射到同一桶),則以鏈表形式追加到桶的尾部。JDK1.8對(duì)HashMap進(jìn)行了優(yōu)化:1.底層結(jié)構(gòu)改為“數(shù)組+鏈表+紅黑樹”。當(dāng)鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64時(shí),鏈表轉(zhuǎn)換為紅黑樹(時(shí)間復(fù)雜度從O(n)降至O(logn));當(dāng)紅黑樹節(jié)點(diǎn)數(shù)≤6時(shí),轉(zhuǎn)回鏈表(避免頻繁轉(zhuǎn)換)。2.哈希計(jì)算優(yōu)化:key的hashCode()與高16位異或(hash=key.hashCode()^(hash>>>16)),減少低位沖突概率。3.擴(kuò)容時(shí)的rehash優(yōu)化:JDK1.7擴(kuò)容時(shí)需重新計(jì)算每個(gè)元素的哈希值并插入新數(shù)組,JDK1.8通過判斷原哈希值的高位是否為0,直接將元素分配到原位置或原位置+舊容量的位置,避免重新計(jì)算哈希。HashMap的擴(kuò)容機(jī)制是怎樣的?為什么容量通常是2的冪次?HashMap的擴(kuò)容觸發(fā)條件:當(dāng)前元素?cái)?shù)量(size)超過閾值(threshold=容量×負(fù)載因子,默認(rèn)0.75)。擴(kuò)容過程:創(chuàng)建新數(shù)組(容量為原容量的2倍),遍歷原數(shù)組的每個(gè)桶,將鏈表或紅黑樹中的元素重新分配到新數(shù)組。容量為2的冪次的原因:1.哈希值的取模運(yùn)算可優(yōu)化為位運(yùn)算((n-1)&hash),比%運(yùn)算更快。2.減少哈希沖突:若容量為2的冪次,n-1的二進(jìn)制為全1,哈希值的低位能充分參與運(yùn)算,分布更均勻。例如,容量為8(1000)時(shí),n-1=7(0111),哈希值與7的按位與結(jié)果范圍是0-7,覆蓋所有桶;若容量為非2的冪次(如6),n-1=5(0101),哈希值的部分位會(huì)被忽略,導(dǎo)致沖突概率增加。ConcurrentHashMap如何保證線程安全?JDK1.7與1.8的實(shí)現(xiàn)有何不同?ConcurrentHashMap是線程安全的哈希表實(shí)現(xiàn),用于多線程環(huán)境。JDK1.7的實(shí)現(xiàn):采用“分段鎖(Segment)”機(jī)制。Segment繼承自ReentrantLock,每個(gè)Segment維護(hù)一個(gè)“數(shù)組+鏈表”的哈希表。默認(rèn)有16個(gè)Segment(并發(fā)級(jí)別),線程操作不同Segment時(shí)互不干擾,鎖粒度為Segment。JDK1.8的優(yōu)化:放棄分段鎖,改用“CAS+synchronized”機(jī)制。底層結(jié)構(gòu)與HashMap相同(數(shù)組+鏈表+紅黑樹),鎖粒度細(xì)化到桶(Node節(jié)點(diǎn))。插入元素時(shí):1.若桶為空,通過CAS原子操作直接插入。2.若桶非空且頭節(jié)點(diǎn)未被鎖定(synchronized鎖定頭節(jié)點(diǎn)),遍歷鏈表或紅黑樹插入。3.若鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64,轉(zhuǎn)換為紅黑樹。優(yōu)化后的優(yōu)點(diǎn):鎖粒度更?。▋H鎖定沖突桶的頭節(jié)點(diǎn)),并發(fā)性能更高;取消Segment減少了內(nèi)存占用。ArrayList與LinkedList的區(qū)別及適用場(chǎng)景?ArrayList:基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),支持隨機(jī)訪問(通過索引O(1)時(shí)間)。插入/刪除元素時(shí),若操作位置不在末尾,需移動(dòng)后續(xù)元素(O(n)時(shí)間)。初始容量為10,擴(kuò)容時(shí)新容量為原容量的1.5倍(intnewCapacity=oldCapacity+(oldCapacity>>1))。LinkedList:基于雙向鏈表實(shí)現(xiàn)(JDK1.6前為循環(huán)鏈表,1.7后取消循環(huán)),每個(gè)節(jié)點(diǎn)包含前驅(qū)和后繼指針。隨機(jī)訪問需遍歷鏈表(O(n)時(shí)間),但插入/刪除元素(已知節(jié)點(diǎn)位置時(shí))僅需修改相鄰節(jié)點(diǎn)指針(O(1)時(shí)間)。適用場(chǎng)景:頻繁隨機(jī)訪問(如遍歷、按索引查詢)選ArrayList。頻繁插入/刪除(尤其是中間位置)選LinkedList;但實(shí)際中若操作位置靠近末尾,ArrayList性能可能更優(yōu)(因數(shù)組連續(xù)內(nèi)存訪問效率高)。線程的創(chuàng)建方式有哪些?各自的優(yōu)缺點(diǎn)?Java中創(chuàng)建線程的方式主要有三種:1.繼承Thread類:定義子類繼承Thread,重寫run()方法,通過start()啟動(dòng)線程。缺點(diǎn):Java單繼承限制,無法再繼承其他類;邏輯與線程綁定,耦合度高。2.實(shí)現(xiàn)Runnable接口:定義類實(shí)現(xiàn)Runnable接口,重寫run()方法,將實(shí)例傳入Thread構(gòu)造器啟動(dòng)。優(yōu)點(diǎn):避免單繼承限制;邏輯與線程分離,更符合面向?qū)ο笤O(shè)計(jì)。3.實(shí)現(xiàn)Callable接口(JDK1.5引入):定義類實(shí)現(xiàn)Callable<V>接口,重寫call()方法(可返回結(jié)果并拋出異常),通過FutureTask包裝Callable實(shí)例,再傳入Thread啟動(dòng)。優(yōu)點(diǎn):支持返回線程執(zhí)行結(jié)果(通過Future獲取);可處理異常。示例(Callable方式):```javaclassMyCallableimplementsCallable<Integer>{@OverridepublicIntegercall()throwsException{return1+2;}}publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{FutureTask<Integer>task=newFutureTask<>(newMyCallable());newThread(task).start();System.out.println(task.get());//輸出3}```synchronized與Lock的區(qū)別是什么?核心區(qū)別:1.鎖的獲取方式:synchronized是關(guān)鍵字,依賴JVM實(shí)現(xiàn),鎖的獲取和釋放自動(dòng)完成(進(jìn)入/退出同步塊時(shí))。Lock是接口(如ReentrantLock),需手動(dòng)調(diào)用lock()獲取鎖,unlock()釋放鎖(通常在finally塊中調(diào)用)。2.鎖的特性:可中斷性:Lock支持lockInterruptibly()方法,允許在等待鎖時(shí)響應(yīng)中斷;synchronized無法中斷,除非拋出異常。超時(shí)獲取:Lock的tryLock(longtime,TimeUnitunit)可指定超時(shí)時(shí)間,避免無限等待;synchronized不支持。公平性:ReentrantLock可通過構(gòu)造器指定為公平鎖(按等待隊(duì)列順序分配鎖)或非公平鎖(默認(rèn),提高吞吐量);synchronized是非公平鎖。3.鎖的粒度:synchronized的鎖粒度是對(duì)象(實(shí)例鎖)或類(類鎖);Lock支持更細(xì)粒度的條件變量(Condition),可實(shí)現(xiàn)精準(zhǔn)喚醒(如生產(chǎn)者-消費(fèi)者模型中喚醒特定線程)。volatile的作用是什么?如何保證可見性和禁止指令重排?volatile是輕量級(jí)的同步機(jī)制,適用于多線程間的變量可見性和禁止指令重排序??梢娦裕篔ava內(nèi)存模型(JMM)規(guī)定,每個(gè)線程有獨(dú)立的工作內(nèi)存,變量的修改需先寫入主內(nèi)存,其他線程從主內(nèi)存讀取。未被volatile修飾的變量,線程可能緩存其副本,導(dǎo)致修改不可見。volatile修飾的變量,每次修改后會(huì)立即刷新到主內(nèi)存,讀取時(shí)強(qiáng)制從主內(nèi)存加載,保證多線程間的可見性。禁止指令重排:編譯器和CPU為優(yōu)化性能會(huì)對(duì)指令重新排序,但可能破壞單例模式等場(chǎng)景的正確性。volatile通過插入內(nèi)存屏障(MemoryBarrier)禁止特定類型的重排序。例如,寫volatile變量前的操作不能重排到寫之后,讀volatile變量后的操作不能重排到讀之前。線程池的核心參數(shù)有哪些?工作流程是怎樣的?線程池(ThreadPoolExecutor)的核心參數(shù):corePoolSize:核心線程數(shù),即使空閑也不會(huì)被銷毀(除非設(shè)置allowCoreThreadTimeOut為true)。maximumPoolSize:最大線程數(shù),線程池允許的最大線程數(shù)量。keepAliveTime:非核心線程的空閑存活時(shí)間(超過此時(shí)間會(huì)被銷毀)。unit:keepAliveTime的時(shí)間單位。workQueue:任務(wù)隊(duì)列,存儲(chǔ)待執(zhí)行的Runnable任務(wù)(如ArrayBlockingQueue、LinkedBlockingQueue)。threadFactory:線程工廠,用于創(chuàng)建線程(可自定義命名規(guī)則)。handler:拒絕策略,當(dāng)任務(wù)隊(duì)列滿且線程數(shù)達(dá)到maximumPoolSize時(shí),處理新任務(wù)的方式(默認(rèn)AbortPolicy,拋出RejectedExecutionException)。工作流程:1.提交任務(wù)時(shí),若當(dāng)前線程數(shù)<corePoolSize,創(chuàng)建新線程執(zhí)行任務(wù)(即使有空閑線程)。2.若線程數(shù)≥corePoolSize,任務(wù)被放入工作隊(duì)列。3.若隊(duì)列已滿且線程數(shù)<maximumPoolSize,創(chuàng)建非核心線程執(zhí)行任務(wù)。4.若隊(duì)列已滿且線程數(shù)≥maximumPoolSize,觸發(fā)拒絕策略。AQS(AbstractQueuedSynchronizer)的核心原理是什么?AQS是Java并發(fā)包(java.util.concurrent)的基礎(chǔ)組件,用于實(shí)現(xiàn)鎖(如ReentrantLock)和同步器(如CountDownLatch)。其核心是通過一個(gè)volatile修飾的int狀態(tài)變量(state)和一個(gè)雙向等待隊(duì)列(CLH隊(duì)列的變種)管理線程的阻塞與喚醒。狀態(tài)變量state:表示同步狀態(tài)(如ReentrantLock中state表示鎖的重入次數(shù)),通過CAS操作修改。等待隊(duì)列:存儲(chǔ)未獲取到鎖的線程節(jié)點(diǎn),節(jié)點(diǎn)包含線程引用、等待狀態(tài)(如SIGNAL、CANCELLED)等信息。AQS提供兩種模式:1.獨(dú)占模式(如ReentrantLock):同一時(shí)間僅一個(gè)線程持有鎖,通過tryAcquire()和tryRelease()方法實(shí)現(xiàn)。2.共享模式(如CountDownLatch):多個(gè)線程可同時(shí)持有鎖,通過tryAcquireShared()和tryReleaseShared()方法實(shí)現(xiàn)。JVM的類加載機(jī)制分為哪幾個(gè)階段?初始化的時(shí)機(jī)有哪些?類加載過程分為加載、連接(驗(yàn)證、準(zhǔn)備、解析)、初始化三個(gè)階段。1.加載:通過類加載器將.class文件的字節(jié)碼加載到內(nèi)存,提供對(duì)應(yīng)的Class對(duì)象。2.連接:驗(yàn)證:檢查字節(jié)碼的正確性(如文件格式、元數(shù)據(jù)、字節(jié)碼、符號(hào)引用驗(yàn)證),防止惡意或錯(cuò)誤的字節(jié)碼破壞JVM。準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存并設(shè)置初始值(如int類型初始為0,引用類型初始為null)。靜態(tài)常量(staticfinal)在準(zhǔn)備階段直接賦值為指定值(因編譯時(shí)已確定)。解析:將符號(hào)引用(如類名、方法名)替換為直接引用(內(nèi)存地址),該階段可延遲到第一次使用時(shí)(動(dòng)態(tài)解析)。3.初始化:執(zhí)行類的初始化代碼(靜態(tài)變量賦值和靜態(tài)代碼塊),由JVM自動(dòng)調(diào)用<clinit>()方法(類構(gòu)造器)。初始化的觸發(fā)時(shí)機(jī)(主動(dòng)使用):創(chuàng)建類的實(shí)例(new、反射、克隆、反序列化)。調(diào)用類的靜態(tài)方法或訪問類的非final靜態(tài)變量。使用反射調(diào)用類的方法(如Class.forName("ClassName"))。初始化子類時(shí),若父類未初始化,先初始化父類(接口的初始化不觸發(fā)父接口初始化)。執(zhí)行主類(包含main()方法的類)。雙親委派模型的作用是什么?如何破壞該模型?雙親委派模型是JVM類加載器的層級(jí)結(jié)構(gòu),核心規(guī)則:類加載器收到加載請(qǐng)求時(shí),先委托給父類加載器嘗試加載,父類加載器無法加載時(shí)(如核心類庫中無該類),再由當(dāng)前類加載器自己加載。作用:1.避免類的重復(fù)加載:同一類由同一加載器加載,保證Class對(duì)象的唯一性。2.保護(hù)核心類庫:防止用戶自定義的類覆蓋JDK的核心類(如自定義java.lang.String會(huì)被引導(dǎo)類加載器(BootstrapClassLoader)優(yōu)先加載,避免安全問題)。破壞雙親委派的場(chǎng)景:1.熱部署/熱加載:如OSGi框架需要?jiǎng)討B(tài)加載/卸載類,自定義類加載器打破層級(jí)委托。2.父類加載器需要子類加載器加載的類:如JDK的SPI(服務(wù)提供者接口)機(jī)制(如JDBC),引導(dǎo)類加載器需要調(diào)用應(yīng)用類加載器加載的驅(qū)動(dòng)實(shí)現(xiàn)類,通過Thread.currentThread().getContextClassLoader()獲取上下文類加載器實(shí)現(xiàn)反向委托。堆(Heap)與棧(Stack)的區(qū)別是什么?存儲(chǔ)內(nèi)容:堆:存儲(chǔ)對(duì)象實(shí)例和數(shù)組(所有對(duì)象都在此分配內(nèi)存),是線程共享的,大小通過-Xms和-Xmx參數(shù)設(shè)置。棧:包括Java虛擬機(jī)棧(線程私有)和本地方法棧(Native方法使用)。Java虛擬機(jī)棧存儲(chǔ)棧幀(每個(gè)方法調(diào)用對(duì)應(yīng)一個(gè)棧幀),棧幀包含局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。生命周期:堆的生命周期與JVM一致,程序結(jié)束時(shí)銷毀。棧的生命周期與線程一致,線程創(chuàng)建時(shí)分配,線程結(jié)束時(shí)銷毀。內(nèi)存管理:堆的內(nèi)存由GC自動(dòng)回收。棧的內(nèi)存由JVM自動(dòng)管理,方法調(diào)用結(jié)束后棧幀彈出,內(nèi)存自動(dòng)釋放。常見的垃圾回收算法有哪些?各有什么優(yōu)缺點(diǎn)?1.標(biāo)記-清除(Mark-Sweep):分為標(biāo)記(標(biāo)記存活對(duì)象)和清除(回收未標(biāo)記的對(duì)象)兩個(gè)階段。優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,無需移動(dòng)對(duì)象。缺點(diǎn):產(chǎn)生內(nèi)存碎片(空閑內(nèi)存不連續(xù)),可能導(dǎo)致大對(duì)象無法分配。2.標(biāo)記-復(fù)制(Mark-Copy):將內(nèi)存分為大小相等的兩塊,每次只使用一塊。標(biāo)記存活對(duì)象后,將其復(fù)制到另一塊未使用的內(nèi)存,然后清空原塊。優(yōu)點(diǎn):無內(nèi)存碎片,復(fù)制后內(nèi)存連續(xù)。缺點(diǎn):可用內(nèi)存減半,空間利用率低(適用于對(duì)象存活率低的場(chǎng)景,如新生代)。3.標(biāo)記-整理(Mark-Compact):標(biāo)記存活對(duì)象后,將所有存活對(duì)象向內(nèi)存一端移動(dòng),然后清除邊界外的內(nèi)存。優(yōu)點(diǎn):無內(nèi)存碎片,空間利用率高。缺點(diǎn):需移動(dòng)對(duì)象,效率低于標(biāo)記-清除(適用于對(duì)象存活率高的場(chǎng)景,如老年代)。CMS(ConcurrentMarkSweep)收集器的工作流程及優(yōu)缺點(diǎn)?CMS是老年代收集器,目標(biāo)是獲取最短停頓時(shí)間(適用于對(duì)響應(yīng)時(shí)間敏感的系統(tǒng))。工作流程分為四步:1.初始標(biāo)記(STW,StopTheWorld):標(biāo)記GCRoots直接關(guān)聯(lián)的對(duì)象,耗時(shí)短。2.并發(fā)標(biāo)記:與用戶線程并發(fā)執(zhí)行,遍歷可達(dá)對(duì)象并標(biāo)記,耗時(shí)較長(zhǎng)。3.重新標(biāo)記(STW):修正并發(fā)標(biāo)記階段因用戶線程修改導(dǎo)致的標(biāo)記錯(cuò)誤,耗時(shí)比初始標(biāo)記長(zhǎng)但短于并發(fā)標(biāo)記。4.并發(fā)清除:與用戶線程并發(fā)執(zhí)行,回收未標(biāo)記的對(duì)象。優(yōu)點(diǎn):并發(fā)收集、低停頓。缺點(diǎn):1.占用CPU資源:并發(fā)階段與用戶線程爭(zhēng)奪CPU,影響吞吐量。2.無法處理浮動(dòng)垃圾:并發(fā)清除階段用戶線程產(chǎn)生的新垃圾(浮動(dòng)垃圾)需等待下一次GC處理。3.內(nèi)存碎片:基于標(biāo)記-清除算法,可能導(dǎo)致老年代內(nèi)存碎片,觸發(fā)FullGC(需壓縮整理)。G1(Garbage-First)收集器的核心特點(diǎn)是什么?G1是JDK7引入的面向服務(wù)器的收集器,目標(biāo)是替換CMS,適用于大內(nèi)存(≥4GB)場(chǎng)景。核心特點(diǎn):1.分區(qū)(Region)管理:將堆劃分為多個(gè)大小相等的Region(默認(rèn)2048個(gè)),每個(gè)Region可以是Eden、Survivor、Old或Humongous(存儲(chǔ)大對(duì)象,超過Region大小的50%)。2.標(biāo)記-整理混合模式:整體采用標(biāo)記-整理算法,局部(Region間)采用標(biāo)記-復(fù)制,避免內(nèi)存碎片。3.預(yù)測(cè)停頓時(shí)間:通過維護(hù)每個(gè)Region的回收價(jià)值(回收所需時(shí)間與回收的空間比),優(yōu)先回收價(jià)值高的Region(Garbage-First),確保停頓時(shí)間不超過用戶設(shè)定的目標(biāo)(-XX:MaxGCPauseMillis)。Error與Exception的區(qū)別是什么?檢查型異常與非檢查型異常如何區(qū)分?Error(錯(cuò)誤):表示JVM無法處理的嚴(yán)重問題(如OutOfMemoryError、StackOverflowError、NoClassDefFoundError),程序無法恢復(fù),通常不應(yīng)捕獲處理。Exception(異常):表示程序可處理的錯(cuò)誤(如IOException、NullPointerException),分為檢查型(Checked)和非檢查型(Unchecked)。檢查型異常:繼承自Exception(除RuntimeException及其子類),必須顯式處理(捕獲或聲明拋出),否則編譯失?。ㄈ鏘OException、SQLException)。非檢查型異常:繼承自RuntimeException(如NullPointerException、IllegalArgumentException)或Error,無需顯式處理,編譯可通過。finally塊的執(zhí)行時(shí)機(jī)是怎樣的?一定執(zhí)行嗎?finally塊用于定義無論是否發(fā)生異常都需執(zhí)行的代碼(如資源釋放)。執(zhí)行時(shí)機(jī):若try塊正常執(zhí)行完畢,finally塊在try塊后執(zhí)行。若try塊拋出異常且被catch塊捕獲,finally塊在catch塊后執(zhí)行。若try塊拋出異常但未被捕獲,finally塊在異常拋給上層前執(zhí)行。finally塊不一定執(zhí)行的情況:1.程序在try或catch塊中調(diào)用System.exit(n)退出JVM。2.線程在try或catch塊中被中斷或終止。3.finally塊所在的線程死亡。try-with-resources的使用場(chǎng)景及原理?try-with-resources是JDK7引入的語法糖,用于自動(dòng)關(guān)閉實(shí)現(xiàn)了AutoCloseable接口的資源(如InputStream、Connection)。使用場(chǎng)景:需要手動(dòng)釋放的資源(如文件、網(wǎng)絡(luò)連接、數(shù)據(jù)庫連接),避免因忘記關(guān)閉導(dǎo)致資源泄漏。原理:編譯器自動(dòng)提供finally塊,調(diào)用資源的close()方法(若資源非null)。多個(gè)資源聲明時(shí),關(guān)閉順序與聲明順序相反(后聲明的資源先關(guān)閉)。示例:```javatry(FileInputStreamfis=newFileInputStream("test.txt");BufferedInputStreambis=newBufferedInputStream(fis)){//使用資源}catch(IOExceptione){e.printStackTrace();}//自動(dòng)關(guān)閉bis和fis```單例模式的常見實(shí)現(xiàn)方式有哪些?雙重檢查鎖為什么需要volatile?單例模式確保類僅有一個(gè)實(shí)例,并提供全局訪問點(diǎn)。常見實(shí)現(xiàn):1.餓漢式:類加載時(shí)創(chuàng)建實(shí)例(線程安全,可能浪費(fèi)資源)。```javaclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}```2.懶漢式(線程不安全):首次調(diào)用時(shí)創(chuàng)建實(shí)例,但多線程下可能創(chuàng)建多個(gè)實(shí)例。```javaclassSingleton{privatestaticSingletonINSTANCE;privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){//多線程可能同時(shí)進(jìn)入INSTANCE=newSingleton();}returnINSTANCE;}}```3.同步方法懶漢式(線程安全,性能差):通過synchronized修飾方法,保證線程安全,但每次調(diào)用都加鎖。```javapublicstaticsynchronizedSingletongetInstance(){...}```4.雙重檢查鎖(DCL,線程安全且高效):```javaclassSingleton{privatestaticvolatileSingletonINSTANCE;//關(guān)鍵:volatile禁止指令重排privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){//第一次檢查,避免不必要的鎖synchronized(Singleton.class){if(INSTANCE==null){//第二次檢查,防止多線程同時(shí)通過第一次檢查INSTANCE=newSingleton();//非原子操作,可能發(fā)生指令重排}}}returnINSTANCE;}}```雙重檢查鎖中volatile的作用:`INSTANCE=newSingleton()`的實(shí)際執(zhí)行分為三步:1.分配內(nèi)存空間。2.初始化對(duì)象。3.將INSTANCE指向分配的內(nèi)存地址。若步驟2和3發(fā)生指令重排(步驟3先于步驟2),其他線程可能看到INSTANCE非null,但對(duì)象未初始化完成,導(dǎo)致空指針異常。volatile禁止此重排,保證可見性和有序性。5.靜態(tài)內(nèi)部類(線程安全,推薦):利用類加載機(jī)制,內(nèi)部類在首次調(diào)用getInstance()時(shí)加載,線程安全且懶加載。```javaclassSingleton{privateSingleton(){}privatestaticclassHolder{staticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}```Spring的IOC(控制反轉(zhuǎn))和AOP(面向切面編程)的核心思想是什么?IOC:傳統(tǒng)程序中對(duì)象的創(chuàng)建和依賴關(guān)系由程序自身管理(如new對(duì)象),IOC將對(duì)象的控制權(quán)交給Spring容器,容器負(fù)責(zé)對(duì)象的創(chuàng)建、依賴注入(DI)和生命周期管理。核心是“對(duì)象的控制權(quán)由程序反轉(zhuǎn)到容器”,降低耦合。AOP:將業(yè)務(wù)邏輯中重復(fù)的非核心功能(如日志、事務(wù)、權(quán)限校驗(yàn))抽取為切面(Aspect),通過動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理或CGLIB)將切面邏輯織入到目標(biāo)方法的指定位置(如方法調(diào)用前、后或異常時(shí))。核心是“將分散在各處的重復(fù)代碼集中管理”,提高代碼復(fù)用性。SpringBean的生命周期包含哪些階段?1.實(shí)例化(Instantiation):通過構(gòu)造器或工廠方法創(chuàng)建Bean的實(shí)例(如調(diào)用無參構(gòu)造器)。2.屬性注入(Population):通過依賴注入(如@Autowired、@Resource)設(shè)置Bean的屬性和依賴。3.初始化前(Post-ProcessingBeforeInitialization):調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法(如@PostConstruct注解的方法在此階段執(zhí)行)。4.初始化(Initialization):若Bean實(shí)現(xiàn)InitializingBean接口,調(diào)用afterPropertiesSet()方法;若配置了init-method,調(diào)用該方法。5.初始化后(Post-ProcessingAfterInitializat
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京住建委事業(yè)編考試題及答案
- 2025年威遠(yuǎn)縣人民醫(yī)院護(hù)士筆試題及答案
- 2025年風(fēng)景園林專業(yè)教師筆試及答案
- 2026年幼兒春節(jié)趣味角色扮演
- 2025年縣政府組織事業(yè)單位考試及答案
- 2025年云南云勤筆試題及答案
- 2026深圳市立數(shù)教育科技有限公司貴州辦事處招聘9人筆試備考試題及答案解析
- 2025年開晟創(chuàng)投筆試及答案
- 2026云南中醫(yī)藥中等專業(yè)學(xué)校招聘2人考試備考試題及答案解析
- 2025年平和人事考試及答案
- 2025年《外科學(xué)基礎(chǔ)》知識(shí)考試題庫及答案解析
- GB/T 3183-2025砌筑水泥
- 煅白制備工安全宣教考核試卷含答案
- 2025及未來5年手持探頭項(xiàng)目投資價(jià)值分析報(bào)告
- 醫(yī)療器械專員工作計(jì)劃及產(chǎn)品注冊(cè)方案
- 《經(jīng)典常談》分層作業(yè)(解析版)
- 紀(jì)法教育微型課件
- 2025至2030中國(guó)牙科探針行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 辦公設(shè)備維護(hù)保養(yǎng)合同
- 畢業(yè)論文寫作與答辯(第三版)課件 專題三 資料收集
- 陶瓷減阻涂層研發(fā)-洞察及研究
評(píng)論
0/150
提交評(píng)論