版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java面試題及答案(2025年金九銀十新版)1.Java跨平臺的核心原理是什么?JDK、JRE、JVM三者的關(guān)系如何?Java跨平臺的核心是JVM(Java虛擬機)。Java程序經(jīng)過編譯提供與平臺無關(guān)的字節(jié)碼文件(.class),由對應(yīng)平臺的JVM解釋執(zhí)行,實現(xiàn)“一次編寫,到處運行”。三者關(guān)系:JDK(Java開發(fā)工具包)包含JRE(Java運行時環(huán)境)和開發(fā)工具(如javac、jconsole);JRE包含JVM和運行Java程序所需的核心類庫;JVM是執(zhí)行字節(jié)碼的虛擬計算機,負(fù)責(zé)內(nèi)存管理、垃圾回收等底層操作。2.基本數(shù)據(jù)類型和包裝類的區(qū)別是什么?Integer的緩存機制有哪些注意點?基本數(shù)據(jù)類型(如int、double)存儲值,無方法;包裝類(如Integer、Double)是對象,提供屬性和方法(如類型轉(zhuǎn)換、比較)。Integer緩存機制:JVM默認(rèn)緩存-128到127的Integer對象,通過Integer.valueOf()提供時直接復(fù)用緩存,而newInteger()始終創(chuàng)建新對象。例如,Integera=127;Integerb=127;a==b為true(緩存復(fù)用);但I(xiàn)ntegerc=128;Integerd=128;c==d為false(超出緩存范圍)。需注意:緩存范圍可通過-XX:AutoBoxCacheMax調(diào)整,但不建議修改,可能引發(fā)兼容性問題。3.重載(Overload)和重寫(Override)的本質(zhì)區(qū)別是什么?構(gòu)造方法能否被重寫?重載是同一類中方法名相同、參數(shù)列表不同(類型/順序/個數(shù))的多態(tài)形式,與返回值、訪問修飾符無關(guān);重寫是子類覆蓋父類同名同參數(shù)方法,需滿足:訪問權(quán)限不小于父類,不能拋出比父類更寬泛的異常(運行時異常除外)。構(gòu)造方法不能被重寫,因為構(gòu)造方法名必須與類名一致,子類無法定義與父類同名的構(gòu)造方法(類名不同),但可以通過super()調(diào)用父類構(gòu)造方法。4.簡述Java異常體系的結(jié)構(gòu)。finally塊中的代碼是否一定會執(zhí)行?Java異常頂層是Throwable,分為Error(JVM錯誤,如OutOfMemoryError,不可恢復(fù))和Exception(程序可處理異常)。Exception又分RuntimeException(未檢查異常,如NullPointerException,可不顯式處理)和受檢異常(CheckedException,如IOException,必須捕獲或聲明拋出)。finally塊中的代碼在以下情況不執(zhí)行:①執(zhí)行finally前調(diào)用System.exit();②線程被中斷或終止;③JVM崩潰。其他情況(如try/catch中return),finally會在return前執(zhí)行(若finally中有return,會覆蓋try/catch的返回值)。5.HashMap在JDK1.8中的底層結(jié)構(gòu)有哪些優(yōu)化?如何解決哈希沖突?JDK1.8前HashMap使用“數(shù)組+鏈表”結(jié)構(gòu);1.8優(yōu)化為“數(shù)組+鏈表+紅黑樹”。當(dāng)鏈表長度≥8且數(shù)組長度≥64時,鏈表轉(zhuǎn)為紅黑樹(查詢時間復(fù)雜度從O(n)降為O(logn));當(dāng)紅黑樹節(jié)點數(shù)≤6時,退化為鏈表。哈希沖突解決:①計算哈希值時,通過hash(key)=key.hashCode()^(key.hashCode()>>>16)擾動函數(shù),減少高位碰撞;②沖突時用鏈表或紅黑樹存儲。需注意:擴(kuò)容時(默認(rèn)負(fù)載因子0.75),新數(shù)組長度為原2倍,元素通過e.hash&(newCap-1)重新分配位置,1.8通過高低位分組優(yōu)化擴(kuò)容效率(無需重新計算哈希)。6.ConcurrentHashMap在JDK1.8中如何保證線程安全?對比1.7有哪些改進(jìn)?JDK1.7的ConcurrentHashMap使用分段鎖(Segment數(shù)組,繼承ReentrantLock),每個Segment管理一段鏈表,鎖粒度為Segment;1.8放棄分段鎖,采用“synchronized+CAS”機制:①數(shù)組節(jié)點(Node)作為鎖對象,鎖粒度更細(xì)(僅鎖定沖突鏈表的頭節(jié)點);②空桶插入時用CAS(Compare-And-Swap)保證原子性;③紅黑樹節(jié)點(TreeBin)作為鎖對象,支持讀寫并發(fā)。改進(jìn)點:鎖粒度更?。◤腟egment到Node),減少鎖競爭;移除分段鎖結(jié)構(gòu),降低內(nèi)存占用;利用synchronized優(yōu)化(JVM對synchronized的鎖升級優(yōu)化,如偏向鎖、輕量級鎖)提升性能。7.線程的生命周期有哪些狀態(tài)?調(diào)用start()和run()方法的區(qū)別是什么?Java線程狀態(tài)(Thread.State枚舉):NEW(新建)、RUNNABLE(可運行,含運行中)、BLOCKED(阻塞,等待鎖)、WAITING(無限等待,需notify/notifyAll喚醒)、TIMED_WAITING(超時等待)、TERMINATED(終止)。start()是啟動線程的正確方式,會調(diào)用本地方法啟動新線程,最終執(zhí)行run();直接調(diào)用run()等同于普通方法調(diào)用,不會啟動新線程,仍在當(dāng)前線程執(zhí)行。8.線程池的核心參數(shù)有哪些?為什么不建議使用Executors工廠類創(chuàng)建線程池?ThreadPoolExecutor的核心參數(shù):①corePoolSize(核心線程數(shù),保留在線程池中的線程數(shù));②maximumPoolSize(最大線程數(shù),允許的最大線程數(shù));③keepAliveTime(非核心線程空閑存活時間);④unit(時間單位);⑤workQueue(任務(wù)隊列,如ArrayBlockingQueue、LinkedBlockingQueue);⑥threadFactory(線程工廠,用于創(chuàng)建線程);⑦h(yuǎn)andler(拒絕策略,任務(wù)無法處理時的回調(diào))。不建議用Executors的原因:①FixedThreadPool和SingleThreadExecutor使用無界隊列(LinkedBlockingQueue),任務(wù)過多時可能OOM;②CachedThreadPool的maximumPoolSize為Integer.MAX_VALUE,可能創(chuàng)建大量線程導(dǎo)致OOM。實際開發(fā)應(yīng)通過ThreadPoolExecutor自定義參數(shù),控制隊列大小和線程數(shù)。9.synchronized的鎖升級過程是怎樣的?偏向鎖、輕量級鎖、重量級鎖的適用場景?synchronized的鎖狀態(tài)隨競爭激烈程度升級(不可逆):①偏向鎖:單線程多次獲取同一鎖時,在對象頭存儲線程ID,減少CAS操作;②輕量級鎖:多線程交替獲取鎖(無競爭),通過CAS嘗試獲取,失敗則自旋(避免線程阻塞);③重量級鎖:競爭激烈時,向OS申請互斥鎖,線程阻塞,適合長時間持鎖場景。適用場景:偏向鎖適合單線程重復(fù)訪問;輕量級鎖適合短時間競爭;重量級鎖適合長時間鎖持有(如復(fù)雜業(yè)務(wù)邏輯)。10.volatile的作用是什么?如何保證可見性和禁止指令重排?volatile的作用:①保證變量可見性(修改后立即刷新到主內(nèi)存,其他線程讀取時從主內(nèi)存獲?。?;②禁止指令重排(通過內(nèi)存屏障,如StoreLoad屏障,限制編譯器和CPU的重排序)??梢娦詫崿F(xiàn):JVM通過內(nèi)存屏障(如lock前綴指令)強制將工作內(nèi)存數(shù)據(jù)刷回主內(nèi)存,并使其他線程的工作內(nèi)存緩存失效。禁止重排:JVM在volatile變量讀寫前后插入內(nèi)存屏障,確?!扒靶虿僮鹘Y(jié)果對后續(xù)可見,且順序不被打亂”。例如,單例模式的雙重檢查鎖定(DCL)中,volatile修飾實例變量可避免指令重排導(dǎo)致的“半初始化”問題。11.如何排查Java程序的內(nèi)存泄漏?常見的內(nèi)存泄漏場景有哪些?排查步驟:①使用JVM工具(如jmap、jconsole、VisualVM)提供堆轉(zhuǎn)儲文件(heapdump);②用MAT(MemoryAnalyzerTool)分析對象引用鏈,定位未被回收的大對象;③檢查是否存在長生命周期對象持有短生命周期對象的引用(如靜態(tài)集合未清理)。常見場景:①ThreadLocal未調(diào)用remove(),導(dǎo)致Entry(弱引用key)的value(強引用)無法回收;②緩存未設(shè)置過期時間(如HashMap做本地緩存,未清理舊數(shù)據(jù));③監(jiān)聽器/回調(diào)未注銷(如注冊事件監(jiān)聽器后未反注冊);④數(shù)據(jù)庫連接、IO流未關(guān)閉(雖然finally中關(guān)閉,但代碼異??赡芴^)。12.Spring的IOC容器如何解決循環(huán)依賴?三級緩存的具體作用是什么?Spring通過三級緩存解決循環(huán)依賴(僅支持單例Bean,原型Bean/構(gòu)造注入無法解決)。三級緩存為:①singletonObjects(一級緩存,存儲已初始化完成的Bean);②earlySingletonObjects(二級緩存,存儲未初始化完成但已創(chuàng)建實例的Bean);③singletonFactories(三級緩存,存儲Bean工廠,用于提供早期Bean引用)。流程:A創(chuàng)建時,將A的工廠(ObjectFactory)存入三級緩存;A需要B,B創(chuàng)建時需要A,此時從三級緩存獲取A的工廠,提供早期A實例存入二級緩存;B完成初始化后存入一級緩存,A獲取B后完成初始化,從二級緩存將A移至一級緩存。三級緩存的核心是通過ObjectFactory的getObject()方法(可能包含AOP代理),確保早期Bean是最終代理對象(而非原始對象)。13.MyBatis的{}和${}有什么區(qū)別?為什么推薦使用{}?{}是預(yù)編譯占位符(?),SQL執(zhí)行前會替換為參數(shù)值,防止SQL注入;${}是字符串拼接,直接將參數(shù)值拼入SQL,存在注入風(fēng)險。例如,查詢用戶名為{name}時,SQL為“SELECTFROMuserWHEREname=?”,參數(shù)值會被預(yù)處理;而${name}會提供“SELECTFROMuserWHEREname=張三”,若name為“'OR1=1--”,會導(dǎo)致全表查詢。推薦{}的原因:安全(防注入)、性能(預(yù)編譯語句可重用)。14.如何設(shè)計一個高并發(fā)場景下的秒殺系統(tǒng)?需要考慮哪些技術(shù)點?設(shè)計要點:①流量攔截:前端限流(按鈕防抖、驗證碼),Nginx層限流(限制IP請求頻率);②庫存扣減:Redis預(yù)存庫存(原子操作decr),避免數(shù)據(jù)庫壓力;③異步處理:訂單提供用MQ(如RocketMQ)異步解耦,減少主線程等待;④數(shù)據(jù)庫保護(hù):悲觀鎖(forupdate)或樂觀鎖(版本號機制)防止超賣;⑤冪等性:通過唯一訂單號(如雪花算法提供)避免重復(fù)提交;⑥降級熔斷:用Hystrix或Sentinel對非核心服務(wù)降級,保證核心流程可用。示例流程:用戶請求→Nginx限流→Redis檢查庫存(庫存>0則扣減)→MQ發(fā)送訂單事件→異步服務(wù)消費MQ,提供訂單并同步數(shù)據(jù)庫(二次校驗庫存)。15.解釋TCP的三次握手和四次揮手過程。為什么揮手需要四次?三次握手(建立連接):①客戶端發(fā)送SYN=1,seq=x(請求連接);②服務(wù)器回復(fù)SYN=1,ACK=x+1,seq=y(確認(rèn)連接);③客戶端發(fā)送ACK=y+1,seq=x+1(確認(rèn)服務(wù)器確認(rèn))。四次揮手(關(guān)閉連接):①客戶端發(fā)送FIN=1,seq=u(請求關(guān)閉);②服務(wù)器回復(fù)ACK=u+1,seq=v(確認(rèn)收到關(guān)閉請求);③服務(wù)器發(fā)送FIN=1,ACK=u+1,seq=w(服務(wù)器準(zhǔn)備關(guān)閉);④客戶端回復(fù)ACK=w+1,seq=u+1(確認(rèn)服務(wù)器關(guān)閉)。揮手需四次的原因:服務(wù)器收到FIN后可能還有未發(fā)送的數(shù)據(jù)(需先回復(fù)ACK,待數(shù)據(jù)發(fā)送完畢再發(fā)FIN),因此ACK和FIN分兩次發(fā)送。16.什么是分布式事務(wù)?常見的解決方案有哪些?分布式事務(wù)指跨多個服務(wù)或數(shù)據(jù)庫的事務(wù),需保證所有參與方要么全成功,要么全回滾。常見方案:①XA協(xié)議(兩階段提交,如JTA):協(xié)調(diào)者(Coordinator)先詢問各參與者(Participant)是否就緒,再統(tǒng)一提交/回滾;缺點是阻塞時間長,性能差。②TCC(Try-Confirm-Cancel):Try階段預(yù)留資源,Confirm階段提交,Cancel階段回滾;適合業(yè)務(wù)可拆分的場景(如電商扣庫存、扣余額)。③事務(wù)補償(Saga模式):通過反向操作補償失敗的步驟(如訂單創(chuàng)建失敗,需回滾庫存增加、積分退回);無全局鎖,性能較好,但需保證補償操作的冪等性。④Seata框架:支持AT(自動補償)、TCC、Saga模式,通過RM(資源管理器)和TM(事務(wù)管理器)協(xié)調(diào),簡化分布式事務(wù)開發(fā)。17.如何優(yōu)化MySQL的慢查詢?索引失效的常見原因有哪些?優(yōu)化步驟:①開啟慢查詢?nèi)罩荆╨ong_query_time=1),定位執(zhí)行時間長的SQL;②用EXPLAIN分析執(zhí)行計劃,查看type(理想為ref或eq_ref)、key(使用的索引)、rows(掃描行數(shù));③優(yōu)化索引(添加覆蓋索引、復(fù)合索引),避免全表掃描;④改寫SQL(如避免SELECT,用JOIN代替子查詢);⑤分庫分表(數(shù)據(jù)量超1000萬時,按時間或ID分片)。索引失效原因:①條件字段使用函數(shù)/表達(dá)式(如WHEREDATE(create_time)='2025-01-01');②左模糊查詢(LIKE'%abc')或全模糊(LIKE'%abc%');③復(fù)合索引未遵循最左匹配(如索引(a,b,c),查詢WHEREb=1不生效);④字段類型隱式轉(zhuǎn)換(如VARCHAR字段用數(shù)字查詢,導(dǎo)致全表掃描);⑤條件使用OR(若OR前后字段均無索引,索引失效)。18.什么是一致性哈希?在分布式緩存中的作用是什么?一致性哈希將節(jié)點和數(shù)據(jù)映射到2^32的環(huán)上,數(shù)據(jù)通過哈希值定位到順時針最近的節(jié)點。當(dāng)節(jié)點增減時,僅影響相鄰節(jié)點的數(shù)據(jù),減少緩存失效范圍。例如,環(huán)上有節(jié)點A、B、C,數(shù)據(jù)X哈希到A和B之間,則歸屬B;若B下線,X歸屬C(原B的下一個節(jié)點),僅X和原B的部分?jǐn)?shù)據(jù)需要遷移,而非全部重新分配。在分布式緩存(如Redis集群)中,一致性哈希解決了傳統(tǒng)哈希取模(節(jié)點增減時大量緩存失效)的問題,提升系統(tǒng)擴(kuò)展性。19.Java17的密封類(SealedClasses)有什么作用?如何定義?密封類限制哪些類可以繼承或?qū)崿F(xiàn)它,增強類型安全性。通過sealed修飾類,并在permits子句中列出允許的子類。例如:```javapublicsealedclassShapepermitsCircle,Rectangle{//父類定義}publicfinalclassCircleextendsShape{//必須為final或sealed//實現(xiàn)}publicnon-sealedclassRectangleextendsShape{//允許其他類繼承Rectangle//實現(xiàn)}```作用:控制類的繼承層級,避免非法子類破壞業(yè)務(wù)邏輯(如支付類型僅允許支付寶、微信支付,禁止其他擴(kuò)展)。20.什么是虛擬線程(VirtualThreads)?對比平臺線程(PlatformThreads)有哪些優(yōu)勢?虛擬線程是JDK19引入的輕量級線程(JEP425),由JVM管理(而非OS內(nèi)核),與平臺線程(映射OS線程)相比,具有以下優(yōu)勢:①低資源消耗:單個JVM可創(chuàng)建百萬級虛擬線程,內(nèi)存占用僅KB級(平臺線程需MB級);②高效調(diào)度:基于協(xié)程模式,阻塞時不阻塞OS線程(通過載體線程(CarrierThread)切換),提升CPU利用率;③代碼兼容:使用Thread.startVirtualThread()創(chuàng)建,與傳統(tǒng)線程API(如Runnable、ExecutorService)兼容。適用場景:高并發(fā)IO密集型應(yīng)用(如HTTP服務(wù)器處理大量請求),減少線程上下文切換開銷。21.設(shè)計一個線程安全的單例模式(懶漢式),要求防止反射和序列化攻擊。推薦使用枚舉實現(xiàn)單例(天然線程安全,防反射/序列化攻擊),但懶漢式可通過靜態(tài)內(nèi)部類+私有構(gòu)造檢查實現(xiàn):```javapublicclassSingleton{privatestaticbooleaninitialized=false;//防反射攻擊privateSingleton(){synchronized(Singleton.class){if(initialized){thrownewIllegalStateException("Instancealreadyexists");}initialized=true;}}privatestaticclassHolder{staticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}//防序列化攻擊protectedObjectreadResolve(){returngetInstance();}}```解釋:靜態(tài)內(nèi)部類Holder在第一次調(diào)用getInstance()時加載,保證懶加載;私有構(gòu)造方法通過synchronized和initialized標(biāo)志防止反射調(diào)用多次;readResolve()方法在反序列化時返回已存在的實例,避免提供新對象。22.如何實現(xiàn)一個自定義的SpringBootStarter?核心步驟有哪些?步驟:①創(chuàng)建Maven項目,添加spring-boot-autoconfigure依賴;②定義自動配置類(@Configuration),使用@Conditional注解(如@ConditionalOnClass、@ConditionalOnMissingBean)控制配置生效條件;③定義屬性配置類(@ConfigurationProperties),綁定perties中的參數(shù);④在META-INF/spring.factories中注冊自動配置類(org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration);⑤打包發(fā)布,其他項目引入依賴后自動生效。示例:實現(xiàn)一個Redis客戶端Starter,自動配置JedisConnectionFactory,允許通過spring.redis.host等屬性配置連接參數(shù)。23.什么是CAP理論?分布式系統(tǒng)中如何權(quán)衡C、A、P?CAP理論指分布式系統(tǒng)無法同時滿足一致性(Consistency)、可用性(Availability)、分區(qū)容錯性(PartitionTolerance),最多滿足兩個。C要求所有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院入住老人福利待遇保障制度
- 企業(yè)內(nèi)部信息傳播制度
- 公共交通應(yīng)急預(yù)案管理制度
- 2026年法學(xué)專業(yè)知識進(jìn)階考試題目及答案
- 2026年財務(wù)會計專業(yè)知識模擬考試試題
- 2026年汽車制造質(zhì)量監(jiān)督執(zhí)紀(jì)模擬測試題
- 2026年圍棋培訓(xùn)協(xié)議
- 母嬰護(hù)理質(zhì)量控制與安全管理
- 化驗樓抗爆安全改造項目環(huán)境影響報告表
- 河南省許昌市襄城縣玉成學(xué)校2025-2026學(xué)年第一學(xué)期期末教學(xué)質(zhì)量檢測七年級生物(含答案)
- 護(hù)理文書書寫規(guī)范與法律風(fēng)險規(guī)避
- DGTJ08-10-2022 城鎮(zhèn)天然氣管道工程技術(shù)標(biāo)準(zhǔn)
- 建筑抗震加固技術(shù)方案設(shè)計案例
- 提高護(hù)理效率的好用工作計劃
- 2025年廣東省深圳市輔警招聘《行政職業(yè)能力測驗》真題及答案
- 醫(yī)院醫(yī)療糾紛案例匯報
- 紅外線桑拿毯行業(yè)跨境出海項目商業(yè)計劃書
- 2025安徽職高單招試題及答案
- 《文獻(xiàn)檢索與科技論文寫作入門》課件(共八章)
- 2025至2030鑄鐵產(chǎn)業(yè)行業(yè)市場深度研究及發(fā)展前景投資可行性分析報告
- 機電設(shè)備安裝工程中電梯系統(tǒng)全生命周期質(zhì)量管控體系
評論
0/150
提交評論