2025年java面試題庫大全及答案_第1頁
2025年java面試題庫大全及答案_第2頁
2025年java面試題庫大全及答案_第3頁
2025年java面試題庫大全及答案_第4頁
2025年java面試題庫大全及答案_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2025年java面試題庫大全及答案Java基礎(chǔ)Java跨平臺的原理是什么?Java程序通過編譯器提供與平臺無關(guān)的字節(jié)碼文件(.class),由不同平臺的Java虛擬機(jī)(JVM)負(fù)責(zé)解釋執(zhí)行字節(jié)碼。JVM屏蔽了底層操作系統(tǒng)和硬件的差異,因此相同的.class文件可在不同平臺的JVM上運(yùn)行,實(shí)現(xiàn)“一次編寫,到處運(yùn)行”?;緮?shù)據(jù)類型和包裝類的區(qū)別有哪些?基本數(shù)據(jù)類型(如int、double)存儲值本身,占用固定內(nèi)存;包裝類(如Integer、Double)是對象,存儲在堆中,支持更多方法(如類型轉(zhuǎn)換、空值處理)。自動裝箱(基本類型轉(zhuǎn)包裝類)和拆箱(包裝類轉(zhuǎn)基本類型)由編譯器自動提供代碼實(shí)現(xiàn),但需注意Integer的緩存機(jī)制(-128~127直接使用緩存對象,超出范圍會新建實(shí)例)。重載(Overload)和重寫(Override)的區(qū)別?重載發(fā)生在同一類中,方法名相同但參數(shù)列表(類型、順序、個數(shù))不同,與返回值無關(guān),是編譯時多態(tài)的體現(xiàn);重寫發(fā)生在子類和父類之間,方法名、參數(shù)列表、返回值完全相同(子類返回值可為父類返回值的子類),訪問權(quán)限不能嚴(yán)于父類,是運(yùn)行時多態(tài)的體現(xiàn)。抽象類和接口的區(qū)別(JDK8+)?抽象類可包含抽象方法、具體方法、構(gòu)造方法、成員變量;接口在JDK8后支持默認(rèn)方法(default)和靜態(tài)方法(static),JDK9支持私有方法。抽象類體現(xiàn)“is-a”關(guān)系(子類是一種抽象類),接口體現(xiàn)“can-do”關(guān)系(具備某種能力)。一個類只能繼承一個抽象類,但可實(shí)現(xiàn)多個接口。異常處理中,finally塊是否一定會執(zhí)行?通常情況下,finally塊在try或catch塊執(zhí)行完畢后一定會執(zhí)行,除非在try/catch塊中調(diào)用了System.exit(0)終止JVM,或線程被中斷/終止。若try和finally中均有return語句,最終返回值為finally中的結(jié)果(但會覆蓋try中的return值,實(shí)際開發(fā)中不建議這樣寫)。集合框架HashMap在JDK7和JDK8中的實(shí)現(xiàn)差異?JDK7使用“數(shù)組+鏈表”結(jié)構(gòu),插入元素時采用頭插法(可能導(dǎo)致多線程擴(kuò)容時鏈表成環(huán));JDK8改為“數(shù)組+鏈表+紅黑樹”結(jié)構(gòu),當(dāng)鏈表長度≥8且數(shù)組長度≥64時,鏈表轉(zhuǎn)換為紅黑樹(查詢時間復(fù)雜度從O(n)降至O(logn)),插入采用尾插法,擴(kuò)容時節(jié)點(diǎn)位置計算優(yōu)化為(e.hash&oldCap)判斷是否需要移動,減少rehash開銷。ConcurrentHashMap如何保證線程安全(JDK8)?JDK8放棄了JDK7的分段鎖(Segment),采用“CAS+synchronized”機(jī)制。當(dāng)插入元素時,首先通過CAS嘗試更新節(jié)點(diǎn),若失敗則對當(dāng)前桶的頭節(jié)點(diǎn)加synchronized鎖,鎖粒度更細(xì)(僅鎖鏈表或紅黑樹的頭節(jié)點(diǎn)),提高并發(fā)性能。ArrayList和LinkedList的適用場景?ArrayList基于動態(tài)數(shù)組,隨機(jī)訪問(get/set)時間復(fù)雜度O(1),但插入/刪除(非末尾)需移動元素,時間復(fù)雜度O(n),適合讀多寫少場景;LinkedList基于雙向鏈表,插入/刪除(僅需修改指針)時間復(fù)雜度O(1)(已知節(jié)點(diǎn)位置時),但隨機(jī)訪問需遍歷鏈表,時間復(fù)雜度O(n),適合寫多讀少場景。HashSet如何保證元素唯一性?HashSet底層依賴HashMap實(shí)現(xiàn),元素作為HashMap的key存儲,value統(tǒng)一為PRESENT(靜態(tài)常量)。添加元素時,先計算元素的hashCode確定桶位置,若桶中無元素則直接插入;若有元素,通過equals方法比較是否已存在相同元素,存在則不插入,否則以鏈表或紅黑樹形式存儲。并發(fā)編程線程的生命周期有哪些狀態(tài)?Java線程狀態(tài)定義在Thread.State枚舉中,包括:NEW(新建)、RUNNABLE(可運(yùn)行,包含就緒和運(yùn)行中)、BLOCKED(阻塞,等待監(jiān)視器鎖)、WAITING(無限等待,需其他線程喚醒)、TIMED_WAITING(超時等待)、TERMINATED(終止)。synchronized的底層實(shí)現(xiàn)原理?synchronized通過對象頭中的MarkWord和Monitor(監(jiān)視器)實(shí)現(xiàn)。對于實(shí)例方法,鎖對象是當(dāng)前實(shí)例;靜態(tài)方法鎖對象是類的Class對象;代碼塊鎖對象是指定對象。JVM會為每個對象關(guān)聯(lián)一個Monitor,獲取鎖即獲取Monitor的所有權(quán)(計數(shù)器+1,可重入),釋放鎖時計數(shù)器-1,減至0時喚醒等待線程。volatile的作用是什么?volatile保證變量的可見性(強(qiáng)制從主內(nèi)存讀寫,禁止線程本地緩存)和禁止指令重排序(通過內(nèi)存屏障實(shí)現(xiàn))。但無法保證原子性(如i++操作包含讀取、修改、寫入三步,非原子),適用于狀態(tài)標(biāo)記(如線程終止標(biāo)志)或單寫多讀場景(如DCL單例中的實(shí)例變量)。線程池的核心參數(shù)有哪些?線程池通過ThreadPoolExecutor創(chuàng)建,核心參數(shù)包括:corePoolSize(核心線程數(shù),即使空閑也保留)、maximumPoolSize(最大線程數(shù))、keepAliveTime(非核心線程空閑超時時間)、unit(時間單位)、workQueue(任務(wù)隊列,如ArrayBlockingQueue、LinkedBlockingQueue)、threadFactory(線程工廠)、handler(拒絕策略,如AbortPolicy(默認(rèn),拋異常)、CallerRunsPolicy(調(diào)用者執(zhí)行))。JVMJVM內(nèi)存區(qū)域如何劃分?JVM內(nèi)存分為:程序計數(shù)器:記錄當(dāng)前線程執(zhí)行的字節(jié)碼行號,線程私有,無OOM。虛擬機(jī)棧:存儲棧幀(局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口),線程私有,棧深度過深拋StackOverflowError,擴(kuò)展失敗拋OOM。本地方法棧:類似虛擬機(jī)棧,服務(wù)于本地方法(Native方法)。堆:存儲對象實(shí)例和數(shù)組,線程共享,是GC的主要區(qū)域,內(nèi)存不足拋OOM。方法區(qū)(元空間,JDK8后):存儲類信息、常量、靜態(tài)變量、即時編譯后的代碼,線程共享,內(nèi)存不足拋OOM。類加載的過程有哪些階段?類加載分為加載、驗證、準(zhǔn)備、解析、初始化五個階段。加載階段通過類加載器將.class文件加載到內(nèi)存;驗證階段檢查字節(jié)碼格式、語義等是否合法;準(zhǔn)備階段為靜態(tài)變量分配內(nèi)存并設(shè)置初始值(如int初始為0);解析階段將符號引用轉(zhuǎn)換為直接引用(如類、方法的實(shí)際內(nèi)存地址);初始化階段執(zhí)行類構(gòu)造器<clinit>()方法(靜態(tài)變量賦值和靜態(tài)代碼塊)。G1收集器的特點(diǎn)是什么?G1(Garbage-First)是面向服務(wù)端的低延遲收集器,適用于大內(nèi)存場景(≥4GB)。其將堆劃分為多個大小相等的Region(默認(rèn)2MB),跟蹤每個Region的回收價值(回收所得內(nèi)存/時間),優(yōu)先回收價值高的Region(MixedGC)。G1通過RememberedSet(RSet)記錄跨Region的引用,避免全堆掃描。目標(biāo)是在滿足停頓時間(PauseTime)目標(biāo)的前提下,最大化吞吐量。內(nèi)存泄漏的常見場景及排查方法?常見場景:長生命周期對象持有短生命周期對象的引用(如靜態(tài)集合存儲臨時對象)、未關(guān)閉的資源(如IO流、數(shù)據(jù)庫連接)、監(jiān)聽器/回調(diào)未正確移除(如注冊后未注銷)。排查方法:使用JVM工具(如jmap提供堆轉(zhuǎn)儲文件,jhat或MAT分析)、Arthas查看對象實(shí)例數(shù)、代碼審計(檢查靜態(tài)變量、資源釋放邏輯)。Spring框架SpringIOC的實(shí)現(xiàn)原理?IOC(控制反轉(zhuǎn))通過容器管理對象的創(chuàng)建和依賴關(guān)系,對象的生命周期由容器控制。底層通過BeanFactory(基礎(chǔ)容器)或ApplicationContext(擴(kuò)展容器,支持事件、國際化等)實(shí)現(xiàn),核心流程包括:讀取配置(XML/注解)、解析Bean定義(BeanDefinition)、實(shí)例化Bean(反射或CGLIB)、屬性注入(自動裝配或顯式注入)、執(zhí)行初始化方法(如@PostConstruct)、注冊到容器中。SpringAOP的底層實(shí)現(xiàn)?AOP(面向切面編程)通過動態(tài)代理實(shí)現(xiàn),分為JDK動態(tài)代理(基于接口)和CGLIB代理(基于類,通過繼承目標(biāo)類提供子類)。JDK動態(tài)代理利用java.lang.reflect.Proxy,通過InvocationHandler攔截方法調(diào)用;CGLIB通過ASM修改字節(jié)碼提供子類,重寫父類方法。Spring默認(rèn)對接口使用JDK代理,對類使用CGLIB(可通過配置強(qiáng)制CGLIB)。Bean的生命周期包含哪些階段?Bean的生命周期包括:實(shí)例化(調(diào)用構(gòu)造方法)→屬性注入(@Autowired、setter注入)→初始化前(BeanPostProcessor的postProcessBeforeInitialization)→初始化(實(shí)現(xiàn)InitializingBean的afterPropertiesSet或@PostConstruct)→初始化后(BeanPostProcessor的postProcessAfterInitialization)→銷毀前(實(shí)現(xiàn)DisposableBean的destroy或@PreDestroy)→銷毀。SpringBoot自動配置的原理?SpringBoot通過@SpringBootApplication注解(包含@EnableAutoConfiguration)啟用自動配置。自動配置類位于META-INF/spring.factories(或spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,JDK9+),通過@Conditional系列注解(如@ConditionalOnClass(類存在時生效)、@ConditionalOnMissingBean(無自定義Bean時生效))判斷是否生效。開發(fā)者可通過perties覆蓋默認(rèn)配置。MyBatisMyBatis如何處理參數(shù)和結(jié)果集?參數(shù)處理:通過{param}(預(yù)編譯,防SQL注入)或${param}(字符串拼接)獲取參數(shù)值,{param}會被替換為?,由PreparedStatement設(shè)置參數(shù);${param}直接替換為參數(shù)值,用于表名、列名等動態(tài)拼接(需手動校驗防注入)。結(jié)果集處理:通過ResultMap將查詢結(jié)果映射到Java對象,支持基本類型、復(fù)雜對象(association)、集合(collection)的嵌套映射,可配置懶加載(延遲加載關(guān)聯(lián)對象)。MyBatis一級緩存和二級緩存的區(qū)別?一級緩存是SqlSession級別的緩存(默認(rèn)開啟),存儲同一SqlSession中相同查詢的結(jié)果,SqlSession關(guān)閉或執(zhí)行增刪改操作時失效。二級緩存是Mapper級別的緩存(需手動開啟),存儲同一命名空間(Mapper)中不同SqlSession的相同查詢結(jié)果,需配置緩存實(shí)現(xiàn)(如Ehcache、Redis),并保證緩存對象可序列化。設(shè)計模式單例模式的雙重檢查鎖定(DCL)為什么需要volatile?DCL的代碼如下:```javapublicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();//非原子操作}}}returninstance;}}```instance=newSingleton()實(shí)際分為三步:分配內(nèi)存→初始化對象→將內(nèi)存地址賦給instance。JVM可能指令重排為分配內(nèi)存→賦地址→初始化。若線程A執(zhí)行到賦地址但未初始化時,線程B判斷instance不為null,直接返回未初始化的對象。volatile禁止指令重排,保證三步按順序執(zhí)行,避免此問題。工廠模式的分類及應(yīng)用場景?工廠模式分為:簡單工廠:通過一個工廠類根據(jù)參數(shù)創(chuàng)建不同產(chǎn)品,缺點(diǎn)是新增產(chǎn)品需修改工廠類(違反開閉原則)。工廠方法:定義工廠接口,每個產(chǎn)品由具體工廠創(chuàng)建(如日志框架,不同日志實(shí)現(xiàn)對應(yīng)不同工廠),解決簡單工廠的擴(kuò)展性問題。抽象工廠:創(chuàng)建產(chǎn)品族(相關(guān)或依賴的產(chǎn)品集合),如跨數(shù)據(jù)庫的DAO工廠(同時創(chuàng)建UserDAO和OrderDAO的MySQL/Oracle實(shí)現(xiàn))。數(shù)據(jù)庫與分布式MySQLInnoDB和MyISAM的區(qū)別?InnoDB支持事務(wù)(ACID)、行級鎖、外鍵約束、聚簇索引(主鍵索引存儲數(shù)據(jù),輔助索引存儲主鍵);MyISAM不支持事務(wù),使用表級鎖,索引為非聚簇索引(索引和數(shù)據(jù)分開存儲)。InnoDB適合高并發(fā)、需要事務(wù)的場景(如訂單系統(tǒng)),MyISAM適合讀多寫少、無事務(wù)需求的場景(如日志表)。如何優(yōu)化慢查詢?步驟:通過慢查詢?nèi)罩荆╯low_query_log)或EXPLAIN分析執(zhí)行計劃,查看type(最好為const,最差為AL

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論