




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java100道面試題及參考答案1.JDK、JRE、JVM的區(qū)別是什么?JDK(JavaDevelopmentKit)是Java開(kāi)發(fā)工具包,包含JRE和開(kāi)發(fā)工具(如javac、jconsole等)。JRE(JavaRuntimeEnvironment)是Java運(yùn)行環(huán)境,包含JVM和運(yùn)行時(shí)所需的核心類庫(kù)。JVM(JavaVirtualMachine)是Java虛擬機(jī),負(fù)責(zé)執(zhí)行字節(jié)碼,實(shí)現(xiàn)跨平臺(tái)。三者關(guān)系:JDK包含JRE,JRE包含JVM。2.Java的基本數(shù)據(jù)類型有哪些?各自的大小是多少?Java有8種基本數(shù)據(jù)類型:byte(1字節(jié))、short(2字節(jié))、int(4字節(jié))、long(8字節(jié))、float(4字節(jié))、double(8字節(jié))、char(2字節(jié))、boolean(無(wú)明確大小,通常1位或1字節(jié))。3.String、StringBuilder、StringBuffer的區(qū)別?String是不可變類,每次修改會(huì)提供新對(duì)象;StringBuilder(JDK1.5)可變、非線程安全,性能高;StringBuffer可變、線程安全(方法用synchronized修飾),性能較低。4.equals()和hashCode()的關(guān)系?若兩個(gè)對(duì)象equals()返回true,則它們的hashCode()必須相同;若hashCode()不同,則equals()一定返回false;但hashCode()相同,equals()可能返回false(哈希沖突)。重寫equals()時(shí)必須重寫hashCode(),否則違反HashMap等集合的存儲(chǔ)規(guī)則。5.final關(guān)鍵字的作用?修飾類:類不可被繼承(如String);修飾方法:方法不可被重寫;修飾變量:變量為常量,基本類型值不可變,引用類型引用不可變但對(duì)象內(nèi)容可變。6.抽象類和接口的區(qū)別?抽象類:可包含抽象方法和具體方法,有構(gòu)造方法,單繼承;接口:只能有抽象方法(JDK8后支持default方法)和靜態(tài)常量,無(wú)構(gòu)造方法,多實(shí)現(xiàn)。JDK8前接口方法全抽象,JDK9支持private方法。7.重寫(Override)和重載(Overload)的區(qū)別?重寫:子類覆蓋父類方法,方法名、參數(shù)、返回值相同(協(xié)變返回值允許子類返回值是父類返回值的子類),訪問(wèn)權(quán)限不能更嚴(yán)格;重載:同一類中方法名相同,參數(shù)列表不同(類型/數(shù)量/順序),與返回值無(wú)關(guān)。8.構(gòu)造方法的特點(diǎn)?方法名與類名相同,無(wú)返回值(無(wú)void),默認(rèn)調(diào)用父類無(wú)參構(gòu)造(super()),可通過(guò)this()調(diào)用本類其他構(gòu)造方法(需在首行)。若類中定義了有參構(gòu)造,默認(rèn)無(wú)參構(gòu)造不再提供。9.靜態(tài)變量(類變量)和實(shí)例變量的區(qū)別?靜態(tài)變量:用static修飾,屬于類,所有實(shí)例共享,類加載時(shí)初始化;實(shí)例變量:屬于實(shí)例,每個(gè)實(shí)例獨(dú)立,實(shí)例創(chuàng)建時(shí)初始化。10.自動(dòng)裝箱(Autoboxing)和拆箱(Unboxing)是什么?自動(dòng)裝箱:基本類型自動(dòng)轉(zhuǎn)為包裝類(如int→Integer);拆箱:包裝類自動(dòng)轉(zhuǎn)為基本類型(如Integer→int)。需注意空指針問(wèn)題(如null拆箱會(huì)拋NPE)和緩存范圍(Integer緩存128~127,超出范圍新對(duì)象)。11.什么是反射?反射是Java在運(yùn)行時(shí)獲取類的信息(如屬性、方法、構(gòu)造器)并操作對(duì)象的能力。通過(guò)Class對(duì)象(Class.forName()、對(duì)象.getClass()、類名.class)獲取元數(shù)據(jù),可調(diào)用私有方法(setAccessible(true)),常見(jiàn)于框架(如Spring的IOC)。12.注解(Annotation)的作用?注解是元數(shù)據(jù),用于為代碼添加說(shuō)明。內(nèi)置注解如@Override(檢查重寫)、@Deprecated(標(biāo)記過(guò)時(shí))、@SuppressWarnings(抑制警告);自定義注解需結(jié)合元注解(@Target、@Retention、@Inherited、@Documented),通過(guò)反射解析。13.泛型的作用?泛型(Generics)實(shí)現(xiàn)類型安全,避免強(qiáng)制類型轉(zhuǎn)換,編譯時(shí)檢查類型。類型擦除(TypeErasure)是泛型實(shí)現(xiàn)機(jī)制,運(yùn)行時(shí)泛型信息被擦除,僅保留原始類型(RawType)。14.異常(Exception)的分類?Throwable是頂級(jí)類,分為Error(JVM錯(cuò)誤,如OutOfMemoryError,不可恢復(fù))和Exception(可處理異常)。Exception分RuntimeException(運(yùn)行時(shí)異常,如NullPointerException,可不顯式處理)和受檢異常(CheckedException,如IOException,必須捕獲或聲明拋出)。15.trywithresources的作用?JDK7引入,用于自動(dòng)關(guān)閉實(shí)現(xiàn)AutoCloseable接口的資源(如IO流、數(shù)據(jù)庫(kù)連接)。資源聲明在try括號(hào)內(nèi),無(wú)論是否拋出異常都會(huì)自動(dòng)關(guān)閉,避免資源泄漏。16.HashMap的底層實(shí)現(xiàn)?JDK7:數(shù)組+鏈表(Entry數(shù)組,哈希沖突時(shí)鏈表存儲(chǔ));JDK8:數(shù)組+鏈表+紅黑樹(shù)(Node數(shù)組,鏈表長(zhǎng)度>8且數(shù)組長(zhǎng)度≥64時(shí)轉(zhuǎn)為紅黑樹(shù),提升查詢效率)。默認(rèn)初始容量16,負(fù)載因子0.75(容量負(fù)載因子=擴(kuò)容閾值),擴(kuò)容時(shí)新容量為原2倍(位運(yùn)算優(yōu)化)。17.HashMap如何解決哈希沖突?通過(guò)鏈地址法(鏈表或紅黑樹(shù)存儲(chǔ)沖突元素)。計(jì)算哈希值時(shí)用key的hashCode()異或高16位(hash=key.hashCode()^(hash>>>16)),減少高位位運(yùn)算丟失的影響;取模用(n1)&hash(n為數(shù)組長(zhǎng)度,需是2的冪次)。18.ConcurrentHashMap如何保證線程安全?JDK7:分段鎖(Segment數(shù)組,每個(gè)Segment獨(dú)立加鎖,默認(rèn)16段,并發(fā)度16);JDK8:CAS+synchronized(數(shù)組+鏈表/紅黑樹(shù),節(jié)點(diǎn)為鎖粒度,synchronized鎖住鏈表頭或紅黑樹(shù)根節(jié)點(diǎn),減少鎖競(jìng)爭(zhēng))。19.ArrayList和LinkedList的區(qū)別?ArrayList:動(dòng)態(tài)數(shù)組,隨機(jī)訪問(wèn)O(1),插入/刪除(非末尾)O(n),默認(rèn)初始容量10,擴(kuò)容1.5倍;LinkedList:雙向鏈表,隨機(jī)訪問(wèn)O(n),插入/刪除O(1)(已知位置),占用內(nèi)存更大(存儲(chǔ)前后指針)。20.HashSet如何保證元素唯一?基于HashMap實(shí)現(xiàn),元素作為HashMap的key,value為固定Object(PRESENT)。添加元素時(shí),若key已存在(hashCode相同且equals為true)則不重復(fù)存儲(chǔ)。21.Iterator和ListIterator的區(qū)別?Iterator:可遍歷List、Set,支持hasNext()、next()、remove();ListIterator:僅用于List,支持雙向遍歷(hasPrevious()、previous()),可修改元素(set())、添加元素(add()),能獲取當(dāng)前索引(nextIndex()、previousIndex())。22.什么是failfast機(jī)制?快速失敗,集合遍歷時(shí)若結(jié)構(gòu)被修改(如添加/刪除元素,非通過(guò)Iterator的remove()),會(huì)拋出ConcurrentModificationException。通過(guò)modCount(修改次數(shù)計(jì)數(shù)器)實(shí)現(xiàn),遍歷前記錄expectedModCount,遍歷時(shí)檢查是否相等。23.線程的創(chuàng)建方式?三種方式:繼承Thread類(重寫run())、實(shí)現(xiàn)Runnable接口(重寫run(),傳給Thread)、實(shí)現(xiàn)Callable接口(重寫call(),有返回值,通過(guò)FutureTask包裝)。24.run()和start()的區(qū)別?run():線程執(zhí)行體,直接調(diào)用是普通方法調(diào)用,在當(dāng)前線程執(zhí)行;start():?jiǎn)?dòng)線程,JVM調(diào)用run(),在新線程執(zhí)行。25.線程的生命周期(狀態(tài))?NEW(新建)、RUNNABLE(可運(yùn)行,包括就緒和運(yùn)行)、BLOCKED(阻塞,等待鎖)、WAITING(無(wú)限等待,如wait())、TIMED_WAITING(超時(shí)等待,如sleep(long))、TERMINATED(終止)。26.synchronized的作用?同步關(guān)鍵字,保證原子性和可見(jiàn)性。修飾代碼塊:鎖對(duì)象是括號(hào)內(nèi)的對(duì)象;修飾方法:普通方法鎖是this,靜態(tài)方法鎖是類對(duì)象(Class)。JDK6后優(yōu)化:偏向鎖→輕量級(jí)鎖→重量級(jí)鎖(鎖升級(jí)),減少性能損耗。27.Lock和synchronized的區(qū)別?Lock是接口(ReentrantLock、ReentrantReadWriteLock),需手動(dòng)釋放鎖(finally中調(diào)用unlock()),支持可中斷鎖(lockInterruptibly())、嘗試鎖(tryLock())、公平鎖(構(gòu)造參數(shù)指定);synchronized是關(guān)鍵字,自動(dòng)釋放鎖,非公平鎖,無(wú)法判斷鎖狀態(tài)。28.volatile的作用?保證變量可見(jiàn)性(修改后立即刷新到主內(nèi)存,其他線程從主內(nèi)存讀?。怪噶钪嘏判颍ㄍㄟ^(guò)內(nèi)存屏障實(shí)現(xiàn))。但不保證原子性(如i++操作非原子),適用于狀態(tài)標(biāo)志(如線程終止標(biāo)志)。29.線程池的核心參數(shù)有哪些?ThreadPoolExecutor構(gòu)造參數(shù):corePoolSize(核心線程數(shù))、maximumPoolSize(最大線程數(shù))、keepAliveTime(非核心線程空閑存活時(shí)間)、TimeUnit(時(shí)間單位)、workQueue(任務(wù)隊(duì)列,如ArrayBlockingQueue、LinkedBlockingQueue)、threadFactory(線程工廠)、handler(拒絕策略)。30.線程池的工作流程?任務(wù)提交時(shí):若核心線程未開(kāi)滿,創(chuàng)建核心線程執(zhí)行;若核心線程滿,任務(wù)入隊(duì);若隊(duì)列滿且未達(dá)最大線程數(shù),創(chuàng)建非核心線程執(zhí)行;若達(dá)到最大線程數(shù),執(zhí)行拒絕策略(AbortPolicy:拋異常;CallerRunsPolicy:調(diào)用者執(zhí)行;DiscardPolicy:丟棄任務(wù);DiscardOldestPolicy:丟棄隊(duì)列最舊任務(wù))。31.Callable和Runnable的區(qū)別?Callable:有泛型返回值(Vcall()),可拋出受檢異常;Runnable:無(wú)返回值(voidrun()),不可拋出受檢異常。需通過(guò)FutureTask獲取Callable結(jié)果(future.get())。32.ThreadLocal的作用和原理?ThreadLocal為每個(gè)線程提供獨(dú)立的變量副本,解決線程安全問(wèn)題(如SimpleDateFormat、數(shù)據(jù)庫(kù)連接)。底層通過(guò)ThreadLocalMap(鍵為ThreadLocal弱引用,值為變量副本)實(shí)現(xiàn),線程結(jié)束時(shí)自動(dòng)回收,避免內(nèi)存泄漏需手動(dòng)調(diào)用remove()。33.死鎖的條件及解決方法?死鎖條件:互斥(資源獨(dú)占)、請(qǐng)求與保持(持有資源并請(qǐng)求其他)、不可搶占(資源不可被強(qiáng)制剝奪)、循環(huán)等待(線程間形成資源循環(huán)鏈)。解決方法:破壞任一條件(如資源一次性分配破壞請(qǐng)求與保持,按序申請(qǐng)破壞循環(huán)等待)。34.CAS(CompareAndSwap)是什么?CAS是樂(lè)觀鎖機(jī)制,包含三個(gè)操作數(shù):內(nèi)存值V、舊預(yù)期值A(chǔ)、新值B。若V==A,則更新V為B,否則重試。JUC包(如AtomicInteger)基于CAS實(shí)現(xiàn),無(wú)鎖提高并發(fā)性能,但存在ABA問(wèn)題(可通過(guò)AtomicStampedReference解決,增加版本號(hào))。35.JVM內(nèi)存區(qū)域如何劃分?程序計(jì)數(shù)器(線程私有,記錄字節(jié)碼執(zhí)行行號(hào))、虛擬機(jī)棧(線程私有,存儲(chǔ)棧幀(局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口),OOM時(shí)拋StackOverflowError)、本地方法棧(線程私有,為本地方法服務(wù))、堆(線程共享,存儲(chǔ)對(duì)象實(shí)例,GC主要區(qū)域,分新生代(Eden、Survivor0、Survivor1)和老年代)、方法區(qū)(線程共享,存儲(chǔ)類信息、常量、靜態(tài)變量,JDK7前是永久代,JDK8后是元空間(使用本地內(nèi)存))。36.垃圾回收(GC)的對(duì)象判定方法?引用計(jì)數(shù)法(對(duì)象被引用計(jì)數(shù)為0時(shí)回收,無(wú)法解決循環(huán)引用)、可達(dá)性分析(從GCRoots(如棧變量、靜態(tài)變量、本地方法棧對(duì)象)出發(fā),不可達(dá)的對(duì)象可回收)。37.垃圾回收算法有哪些?標(biāo)記清除(MarkSweep):標(biāo)記不可達(dá)對(duì)象并清除,效率低,產(chǎn)生內(nèi)存碎片;復(fù)制(Copying):將存活對(duì)象復(fù)制到另一區(qū)域,清空原區(qū)域,無(wú)碎片,適用于存活少的區(qū)域(如新生代);標(biāo)記整理(MarkCompact):標(biāo)記后將存活對(duì)象移到一端,清空邊界外內(nèi)存,適用于存活多的區(qū)域(如老年代);分代收集(GenerationalCollection):新生代用復(fù)制算法,老年代用標(biāo)記整理或標(biāo)記清除。38.常見(jiàn)的垃圾收集器有哪些?Serial(單線程,新生代,復(fù)制算法,適用于客戶端)、ParNew(Serial多線程版,配合CMS)、ParallelScavenge(新生代,復(fù)制算法,目標(biāo)是吞吐量)、CMS(老年代,標(biāo)記清除,目標(biāo)是低停頓,步驟:初始標(biāo)記→并發(fā)標(biāo)記→重新標(biāo)記→并發(fā)清除)、G1(全區(qū)域,標(biāo)記整理+復(fù)制,劃分Region,優(yōu)先回收價(jià)值高的區(qū)域)、ZGC(JDK11+,低延遲,支持TB級(jí)內(nèi)存)。39.類加載的過(guò)程?加載(通過(guò)類加載器將.class文件加載到內(nèi)存,提供Class對(duì)象)、驗(yàn)證(檢查字節(jié)碼格式、語(yǔ)義等)、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并賦初始值,如int賦0)、解析(將符號(hào)引用轉(zhuǎn)為直接引用)、初始化(執(zhí)行類構(gòu)造器<clinit>(),為靜態(tài)變量賦實(shí)際值,執(zhí)行靜態(tài)代碼塊)。40.什么是雙親委派模型?類加載器(啟動(dòng)類加載器→擴(kuò)展類加載器→應(yīng)用類加載器→自定義類加載器)加載類時(shí),先委托父類加載器加載,父類無(wú)法加載時(shí)再自己加載。避免重復(fù)加載,保證核心類(如java.lang.Object)的安全。41.堆和棧的區(qū)別?堆:線程共享,存儲(chǔ)對(duì)象實(shí)例和數(shù)組,內(nèi)存大,GC管理;棧(虛擬機(jī)棧):線程私有,存儲(chǔ)棧幀(局部變量、操作數(shù)等),內(nèi)存小,生命周期與線程一致,棧深度過(guò)大拋StackOverflowError。42.常見(jiàn)的OOM(內(nèi)存溢出)場(chǎng)景?堆溢出(對(duì)象過(guò)多,如循環(huán)創(chuàng)建大對(duì)象,錯(cuò)誤信息:java.lang.OutOfMemoryError:Javaheapspace)、棧溢出(遞歸過(guò)深或棧幀過(guò)大,錯(cuò)誤信息:java.lang.StackOverflowError)、方法區(qū)溢出(類或常量過(guò)多,如動(dòng)態(tài)提供大量類,JDK7前:PermGenspace,JDK8后:Metaspace)、直接內(nèi)存溢出(ByteBuffer.allocateDirect()分配過(guò)多,錯(cuò)誤信息與堆溢出類似)。43.什么是IOC(控制反轉(zhuǎn))?IOC(InversionofControl)是依賴注入(DI)的設(shè)計(jì)模式,將對(duì)象的創(chuàng)建和依賴關(guān)系的管理由程序轉(zhuǎn)移到容器(如Spring)。容器通過(guò)反射創(chuàng)建對(duì)象并注入依賴,降低耦合。44.什么是AOP(面向切面編程)?AOP(AspectOrientedProgramming)通過(guò)動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理或CGLIB)將橫切關(guān)注點(diǎn)(如日志、事務(wù))與業(yè)務(wù)邏輯分離,提高代碼復(fù)用。核心概念:切面(Aspect)、連接點(diǎn)(JoinPoint)、切點(diǎn)(Pointcut)、通知(Advice,前置/后置/環(huán)繞/異常/返回)。45.SpringBean的生命周期?實(shí)例化(調(diào)用構(gòu)造方法)→屬性注入(依賴注入)→Aware接口回調(diào)(如BeanNameAware、ApplicationContextAware)→BeanPostProcessor前置處理(postProcessBeforeInitialization)→初始化方法(@PostConstruct或afterPropertiesSet())→BeanPostProcessor后置處理(postProcessAfterInitialization)→使用→銷毀方法(@PreDestroy或destroy())。46.依賴注入的方式?構(gòu)造器注入(通過(guò)構(gòu)造方法注入依賴,保證依賴不可變)、setter注入(通過(guò)set方法注入,適合可選依賴)、接口注入(過(guò)時(shí),不推薦)、注解注入(@Autowired、@Resource)。47.@Autowired和@Resource的區(qū)別?@Autowired:Spring注解,按類型注入,可通過(guò)@Qualifier指定名稱;@Resource:JSR250注解,默認(rèn)按名稱注入(name屬性),無(wú)名稱時(shí)按類型注入,屬于Java標(biāo)準(zhǔn)。48.Spring事務(wù)的傳播行為?PROPAGATION_REQUIRED(默認(rèn),當(dāng)前有事務(wù)則加入,無(wú)則新建)、PROPAGATION_SUPPORTS(當(dāng)前有事務(wù)則加入,無(wú)則非事務(wù)執(zhí)行)、PROPAGATION_MANDATORY(當(dāng)前必須有事務(wù),無(wú)則拋異常)、PROPAGATION_REQUIRES_NEW(新建事務(wù),掛起當(dāng)前事務(wù))、PROPAGATION_NOT_SUPPORTED(非事務(wù)執(zhí)行,掛起當(dāng)前事務(wù))、PROPAGATION_NEVER(當(dāng)前必須無(wú)事務(wù),有則拋異常)、PROPAGATION_NESTED(嵌套事務(wù),基于保存點(diǎn),父事務(wù)回滾子事務(wù)也回滾,子事務(wù)獨(dú)立回滾不影響父)。49.SpringMVC的工作流程?客戶端請(qǐng)求→DispatcherServlet(前端控制器)→HandlerMapping(映射處理器)→返回HandlerExecutionChain(處理器+攔截器)→HandlerAdapter(適配處理器)→調(diào)用Controller處理→返回ModelAndView→ViewResolver(解析視圖)→渲染視圖→響應(yīng)客戶端。50.SpringBoot的自動(dòng)配置原理?通過(guò)@SpringBootApplication(包含@EnableAutoConfiguration)啟用自動(dòng)配置,掃描classpath下METAINF/spring.factories文件,加載候選配置類。配置類通過(guò)@Conditional(如@ConditionalOnClass、@ConditionalOnMissingBean)條件判斷是否生效,覆蓋默認(rèn)配置(通過(guò)@Bean定義相同Bean)。51.SpringBootStarter的作用?Starter是依賴集合,封裝常用場(chǎng)景的依賴(如springbootstarterweb包含SpringMVC、Tomcat等),簡(jiǎn)化依賴管理。自定義Starter需遵循命名規(guī)范(如xxxspringbootstarter),并提供自動(dòng)配置類。52.SpringCloud的核心組件有哪些?Eureka(服務(wù)注冊(cè)與發(fā)現(xiàn))、Ribbon(客戶端負(fù)載均衡)、Feign(聲明式HTTP客戶端,集成Ribbon)、Hystrix(服務(wù)熔斷與降級(jí),防止級(jí)聯(lián)故障)、Zuul(服務(wù)網(wǎng)關(guān),路由、過(guò)濾)、Config(分布式配置中心)、Sleuth(分布式鏈路追蹤)。53.事務(wù)的四大特性(ACID)?原子性(Atomicity,事務(wù)不可分割,要么全做要么全不做)、一致性(Consistency,事務(wù)執(zhí)行前后數(shù)據(jù)狀態(tài)一致)、隔離性(Isolation,事務(wù)間互不干擾,通過(guò)隔離級(jí)別控制)、持久性(Durability,事務(wù)提交后數(shù)據(jù)永久保存)。54.數(shù)據(jù)庫(kù)的隔離級(jí)別有哪些?各解決什么問(wèn)題?讀未提交(ReadUncommitted,可能臟讀)、讀已提交(ReadCommitted,解決臟讀,可能不可重復(fù)讀)、可重復(fù)讀(RepeatableRead,解決臟讀和不可重復(fù)讀,可能幻讀,MySQL默認(rèn))、串行化(Serializable,解決所有問(wèn)題,性能低)。55.索引的類型有哪些?如何優(yōu)化索引?類型:主鍵索引(唯一,非空)、唯一索引(值唯一)、普通索引、復(fù)合索引(多列組合)、全文索引(文本搜索)。優(yōu)化:避免在低基數(shù)列(如性別)建索引,復(fù)合索引遵循最左前綴原則,索引列避免使用函數(shù)或表達(dá)式,定期重建/分析索引。56.SQL注入的原理及預(yù)防?原理:用戶輸入包含SQL代碼,拼接后改變?cè)璖QL邏輯(如"OR'1'='1")。預(yù)防:使用PreparedStatement(參數(shù)化查詢)、過(guò)濾特殊字符、限制數(shù)據(jù)庫(kù)權(quán)限。57.JDBC的步驟?加載驅(qū)動(dòng)(Class.forName("com.mysql.cj.jdbc.Driver"))→獲取連接(DriverManager.getConnection(url,user,password))→創(chuàng)建Statement(Statement/PreparedStatement/CallableStatement)→執(zhí)行SQL(executeQuery()/executeUpdate())→處理結(jié)果集(ResultSet)→關(guān)閉資源(逆序關(guān)閉ResultSet、Statement、Connection)。58.數(shù)據(jù)庫(kù)連接池的作用?連接池管理數(shù)據(jù)庫(kù)連接,避免頻繁創(chuàng)建/關(guān)閉連接的開(kāi)銷,控制連接數(shù)防止數(shù)據(jù)庫(kù)過(guò)載。常見(jiàn)連接池:HikariCP(高性能,SpringBoot默認(rèn))、Druid(阿里,支持監(jiān)控)、DBCP、C3P0。59.MyBatis的{}和${}的區(qū)別?{}:預(yù)編譯參數(shù),防止SQL注入,替換為?(PreparedStatement);${}:字符串拼接,直接替換為參數(shù)值,存在注入風(fēng)險(xiǎn),用于表名/列名動(dòng)態(tài)替換。60.MyBatis的一級(jí)緩存和二級(jí)緩存?一級(jí)緩存:SqlSession級(jí)別的緩存(默認(rèn)開(kāi)啟),相同SqlSession中相同查詢會(huì)命中緩存;二級(jí)緩存:Mapper級(jí)別的緩存(需配置),多個(gè)SqlSession共享,需序列化對(duì)象(實(shí)現(xiàn)Serializable)。61.冒泡排序的原理及時(shí)間復(fù)雜度?原理:兩兩比較相鄰元素,大的后移,每輪確定一個(gè)最大元素。時(shí)間復(fù)雜度:最好O(n)(已排序),最壞O(n2),平均O(n2),穩(wěn)定排序。62.快速排序的原理及時(shí)間復(fù)雜度?原理:分治,選基準(zhǔn)值(pivot),將數(shù)組分為小于/大于基準(zhǔn)的兩部分,遞歸排序子數(shù)組。時(shí)間復(fù)雜度:最好O(nlogn),最壞O(n2)(已排序且選首元素為基準(zhǔn)),平均O(nlogn),不穩(wěn)定排序。63.二分查找的條件?數(shù)組必須有序(升序或降序),且為隨機(jī)訪問(wèn)結(jié)構(gòu)(如數(shù)組,鏈表不適用)。時(shí)間復(fù)雜度O(logn)。64.鏈表和數(shù)組的區(qū)別?數(shù)組:連續(xù)內(nèi)存,隨機(jī)訪問(wèn)快,插入/刪除慢;鏈表:非連續(xù)內(nèi)存(節(jié)點(diǎn)含指針),隨機(jī)訪問(wèn)慢,插入/刪除快(已知位置)。65.二叉樹(shù)的遍歷方式?前序(根→左→右)、中序(左→根→右)、后序(左→右→根)、層序(按層遍歷,用隊(duì)列實(shí)現(xiàn))。66.DFS(深度優(yōu)先搜索)和BFS(廣度優(yōu)先搜索)的區(qū)別?DFS:用棧(遞歸或顯式棧)實(shí)現(xiàn),優(yōu)先訪問(wèn)子節(jié)點(diǎn),適用于路徑查找;BFS:用隊(duì)列實(shí)現(xiàn),優(yōu)先訪問(wèn)同層節(jié)點(diǎn),適用于最短路徑。67.動(dòng)態(tài)規(guī)劃和貪心算法的區(qū)別?動(dòng)態(tài)規(guī)劃:解決重疊子問(wèn)題,保存子問(wèn)題結(jié)果(記憶化),全局最優(yōu)需考慮所有可能;貪心算法:每步選局部最優(yōu),不一定得到全局最優(yōu)(如硬幣問(wèn)題,硬幣面額為25、10、5、1時(shí)貪心有效,但若有25、10、4則無(wú)效)。68.單例模式的實(shí)現(xiàn)方式?餓漢式(類加載時(shí)初始化,線程安全):```javapublicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}```懶漢式(雙重檢查鎖定,線程安全):```javapublicclassSingleton{privatestaticvolatileSingletonINSTANCE;//禁止指令重排序privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){synchronized(Singleton.class){if(INSTANCE==null){INSTANCE=newSingleton();}}}returnINSTANCE;}}```69.工廠模式的作用?工廠模式(簡(jiǎn)單工廠、工廠方法、抽象工廠)將對(duì)象創(chuàng)建與使用分離,提高擴(kuò)展性。簡(jiǎn)單工廠通過(guò)工廠類創(chuàng)建對(duì)象(如根據(jù)類型返回不同產(chǎn)品);工廠方法通過(guò)子類決定創(chuàng)建哪種對(duì)象;抽象工廠創(chuàng)建產(chǎn)品族(相關(guān)或依賴的對(duì)象)。70.代理模式的作用?代理模式為對(duì)象提供代理,控制對(duì)原對(duì)象的訪問(wèn)(如遠(yuǎn)程代理、虛擬代理、動(dòng)態(tài)代理)。靜態(tài)代理:手動(dòng)編寫代理類;動(dòng)態(tài)代理:JDK動(dòng)態(tài)代理(基于接口,InvocationHandler)、CGLIB(基于類,MethodInterceptor)。71.觀察者模式的作用?觀察者模式(發(fā)布訂閱)定義對(duì)象間一對(duì)多依賴,主題(Subject)狀態(tài)變化時(shí)通知所有觀察者(Observer)。常見(jiàn)于事件監(jiān)聽(tīng)(如Swing組件)、消息隊(duì)列。72.IO和NIO的區(qū)別?IO:面向流(Stream),阻塞IO(BIO),一次讀/寫一個(gè)字節(jié),效率低;NIO:面向緩沖區(qū)(Buffer),非阻塞IO(NIO),使用Selector多路復(fù)用,可同時(shí)處理多個(gè)連接。73.BIO、NIO、AIO的區(qū)別?BIO(BlockingIO):同步阻塞,每個(gè)連接一個(gè)線程;NIO(NewIO/NonblockingIO):同步非阻塞,一個(gè)線程管理多個(gè)連接(Selector);AIO(AsynchronousIO):異步非阻塞,回調(diào)通知完成(Java7引入,基于事件和回調(diào))。74.JUC包中的常用類?CountDownLatch(倒計(jì)時(shí)門閂,等待N個(gè)線程完成,如countDown()和await())、CyclicBarrier(循環(huán)屏障,等待N個(gè)線程到達(dá)后同步執(zhí)行)、Semaphore(信號(hào)量,控制同時(shí)訪問(wèn)的線程數(shù))、Exchanger(交換器,兩個(gè)線程交換數(shù)據(jù))。75.HTTP狀態(tài)碼的分類?1xx(信息類,如100Continue)、2xx(成功,如200OK)、3xx(重定向,如301永久重定向、302臨時(shí)重定向、304未修改)、4xx(客戶端錯(cuò)誤,如404NotFound、403Forbidden)、5xx(服務(wù)器錯(cuò)誤,如500InternalServerError、503ServiceUnavailable)。76.TCP三次握手和四次揮手?三次握手:客戶端→服務(wù)器(SYN=1,seq=x);服務(wù)器→客戶端(SYN=1,ACK=1,seq=y,ack=x+1);客戶端→服務(wù)器(ACK=1,seq=x+1,ack=y+1)。四次揮手:客戶端→服務(wù)器(FIN=1,seq=u);服務(wù)器→客戶端(ACK=1,seq=v,ack=u+1);服務(wù)器→客戶端(FIN=1,ACK=1,seq=w,ack=u+1);客戶端→服務(wù)器(ACK=1,seq=u+1,ack=w+1)。77.設(shè)計(jì)模式的六大原則?單一職責(zé)(一個(gè)類只做一件事)、開(kāi)閉原則(對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉)、里氏替換(子類可替換父類)、依賴倒置(依賴抽象而非具體)、接口隔離(接口小而專)、迪米特法則(最少知識(shí)原則,減少類間依賴)。78.什么是內(nèi)存泄漏?如何排查??jī)?nèi)存泄漏:對(duì)象不再使用但未被GC回收(如長(zhǎng)生命周期對(duì)象持有短生命周期對(duì)象的引用)。排查工具:JProfiler、VisualVM(查看堆轉(zhuǎn)儲(chǔ),分析大對(duì)象和引用鏈)、MAT(EclipseMemoryAnalyzer)。79.什么是序列化和反序列化?序列化(Serialization):將對(duì)象轉(zhuǎn)為字節(jié)流,便于存儲(chǔ)或傳輸;反序列化(Deserialization):將字節(jié)流恢復(fù)為對(duì)象。Java中通過(guò)實(shí)現(xiàn)Serializable接口(標(biāo)記接口)或Externalizable接口(自定義序列化邏輯)。80.什么是JIT(即時(shí)編譯)?JIT(JustInTimeCompiler)是JVM的優(yōu)化技術(shù),將熱點(diǎn)代碼(頻繁執(zhí)行的方法)編譯為本地機(jī)器碼,提高執(zhí)行效率。熱點(diǎn)檢測(cè)通過(guò)計(jì)數(shù)器(方法調(diào)用次數(shù)、回邊次數(shù))。81.如何實(shí)現(xiàn)對(duì)象的深拷貝?深拷貝:復(fù)制對(duì)象及其所有引用的對(duì)象。實(shí)現(xiàn)方式:重寫clone()方法(調(diào)用super.clone()后手動(dòng)復(fù)制引用對(duì)象)、序列化(對(duì)象→字節(jié)流→新對(duì)象)、工具類(如ApacheCommonsLang的SerializationUtils)。82.什么是冪等性?如何實(shí)現(xiàn)??jī)绲刃裕憾啻握?qǐng)求同一操作結(jié)果一致(如查詢、刪除)。實(shí)現(xiàn)方式:唯一標(biāo)識(shí)(如訂單號(hào))、數(shù)據(jù)庫(kù)唯一約束、狀態(tài)機(jī)(如支付狀態(tài)從“未支付”→“已支付”不可逆)、Token機(jī)制(防止重復(fù)提交)。83.什么是大對(duì)象?如何處理?大對(duì)象:占用內(nèi)存大的對(duì)象(如長(zhǎng)字符串、大數(shù)組),易導(dǎo)致老年代空間不足。處理:避免在堆中存儲(chǔ)大對(duì)象(如轉(zhuǎn)存到數(shù)據(jù)庫(kù))、調(diào)整JVM參數(shù)(XX:PretenureSizeThreshold設(shè)置大對(duì)象直接進(jìn)入老年代)。84.如何優(yōu)化Java程序的性能??jī)?yōu)化方向:減少對(duì)象創(chuàng)建(如使用對(duì)象池)、避免內(nèi)存泄漏(及時(shí)釋放資源)、合理使用緩存(如Redis、本地緩存)、優(yōu)化數(shù)據(jù)庫(kù)操作(減少SQL查詢次數(shù),使用索引)、多線程并行處理(如并行流、線程池)、JVM調(diào)優(yōu)(調(diào)整堆大小、垃圾收集器)。85.什么是跨域?如何解決?跨域:瀏覽器同源策略限制(協(xié)議、域名、端口相同),不同源的請(qǐng)求被阻止。解決方法:JSONP(利用script標(biāo)簽)、CORS(服務(wù)器添加響應(yīng)頭AccessControlAllowOrigin)、反向代理(前端請(qǐng)求同域代理服務(wù)器,代理轉(zhuǎn)發(fā))。86.什么是分布式鎖?常見(jiàn)實(shí)現(xiàn)方式?分布式鎖:控制分布式系統(tǒng)中多進(jìn)程對(duì)共享資源的訪問(wèn)。實(shí)現(xiàn)方式:Redis(set命令+過(guò)期時(shí)間,Redisson框架)、ZooKeeper(臨時(shí)順序節(jié)點(diǎn),監(jiān)聽(tīng)節(jié)點(diǎn)刪除事件)、數(shù)據(jù)庫(kù)(樂(lè)觀鎖(版本號(hào))、悲觀鎖(forupdate))。87.什么是CAP理論?CAP理論:分布式系統(tǒng)無(wú)法同時(shí)滿足一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(PartitionTolerance),最多滿足兩個(gè)。通常選擇AP(如Redis)或CP(如ZooKeeper)。88.
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版互聯(lián)網(wǎng)數(shù)據(jù)中心(IDC)機(jī)房租賃合同范本
- 二零二五版鋁礦產(chǎn)品出口退稅及免稅服務(wù)合同
- 二零二五年度建筑施工安全責(zé)任與事故處理協(xié)議
- 二零二五年度自媒體人廣告?zhèn)蚪鸷献鲄f(xié)議范本
- 二零二五年度德漢能源市場(chǎng)分析報(bào)告翻譯合同
- 2025版科技園區(qū)前期物業(yè)服務(wù)委托合同范本
- 2025版新能源發(fā)電站綜合勞務(wù)分包合同
- 二零二五版電子商務(wù)平臺(tái)用戶隱私保護(hù)服務(wù)合同
- 2025版離婚補(bǔ)償協(xié)議書模板:財(cái)產(chǎn)分割及子女撫養(yǎng)權(quán)全面協(xié)議
- 二零二五年度鋼結(jié)構(gòu)安全責(zé)任協(xié)議書附件七
- 餐飲業(yè)安全生產(chǎn)管理制度匯編
- 杜絕抱怨的培訓(xùn)
- 《空調(diào)維護(hù)培訓(xùn)資料》課件
- 底泥資源化利用研究進(jìn)展
- 大企業(yè)稅收風(fēng)險(xiǎn)分析典型案例匯編
- 混凝土質(zhì)量保證措施
- 煙氣CEMS在線比對(duì)驗(yàn)收調(diào)試報(bào)告附表D.1-12計(jì)算公式(HJ-75-2017)
- 學(xué)生請(qǐng)假安全協(xié)議書
- 隱形眼鏡項(xiàng)目風(fēng)險(xiǎn)管理分析
- 砍伐桉樹(shù)合同范文
- 過(guò)敏性休克應(yīng)急處置流程
評(píng)論
0/150
提交評(píng)論