高頻java研發(fā)工程師面試題及答案_第1頁
高頻java研發(fā)工程師面試題及答案_第2頁
高頻java研發(fā)工程師面試題及答案_第3頁
高頻java研發(fā)工程師面試題及答案_第4頁
高頻java研發(fā)工程師面試題及答案_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

高頻java研發(fā)工程師面試題及答案Java中面向?qū)ο蟮乃拇筇匦允欠庋b、繼承、多態(tài)和抽象。封裝通過訪問控制修飾符(如private、protected)限制外部對內(nèi)部狀態(tài)的直接訪問,僅暴露必要接口;繼承允許子類復(fù)用父類代碼并擴(kuò)展新功能;多態(tài)表現(xiàn)為父類引用指向子類對象,運(yùn)行時(shí)動(dòng)態(tài)調(diào)用子類方法;抽象通過抽象類或接口定義規(guī)范,隱藏具體實(shí)現(xiàn)細(xì)節(jié)。抽象類和接口的核心區(qū)別在于:抽象類可包含具體方法、構(gòu)造方法和成員變量,接口JDK8前僅能有抽象方法(默認(rèn)方法和靜態(tài)方法后支持);抽象類單繼承,接口多實(shí)現(xiàn);抽象類強(qiáng)調(diào)"是不是"的關(guān)系(如動(dòng)物抽象類與貓子類),接口強(qiáng)調(diào)"能不能"的能力(如飛行接口)。重載(Overload)和重寫(Override)的區(qū)別:重載發(fā)生在同一類中,方法名相同但參數(shù)列表(類型、順序、數(shù)量)不同,與返回值無關(guān);重寫發(fā)生在父子類或接口實(shí)現(xiàn)類中,方法名、參數(shù)、返回值完全相同(子類返回值可為父類返回值的子類),訪問權(quán)限不能嚴(yán)于父類,不能重寫父類的final或靜態(tài)方法。例如,計(jì)算兩個(gè)數(shù)之和的add(inta,intb)和add(doublea,doubleb)是重載;子類重寫父類的toString()方法是重寫。String、StringBuilder、StringBuffer的區(qū)別:String是不可變類,底層使用finalchar[]存儲(chǔ),每次修改會(huì)提供新對象;StringBuilder線程不安全,效率高,適用于單線程字符串拼接;StringBuffer線程安全(方法用synchronized修飾),效率較低,適用于多線程場景。例如循環(huán)中拼接字符串時(shí),使用String會(huì)導(dǎo)致大量中間對象,應(yīng)優(yōu)先選擇StringBuilder。Java異常分為Error和Exception,前者(如OutOfMemoryError)表示JVM無法處理的嚴(yán)重問題,程序不應(yīng)捕獲;后者分為受檢異常(CheckedException,如IOException)需顯式處理(throws或try-catch)和非受檢異常(UncheckedException,如RuntimeException及其子類NullPointerException、ArrayIndexOutOfBoundsException)。finally塊中的代碼無論是否發(fā)生異常都會(huì)執(zhí)行(除非JVM退出),若try和finally都有return,最終返回finally的值(不建議這樣寫)。泛型的作用是編譯期類型檢查和消除強(qiáng)制類型轉(zhuǎn)換,類型擦除發(fā)生在編譯階段,運(yùn)行時(shí)無法獲取泛型具體類型(如List<String>和List<Integer>運(yùn)行時(shí)類型相同)。通配符?表示任意類型,<?extendsT>上限通配符(允許T及其子類),<?superT>下限通配符(允許T及其父類)。反射允許程序在運(yùn)行時(shí)獲取類的信息(如方法、字段)并調(diào)用,常見應(yīng)用場景包括框架(Spring的依賴注入)、動(dòng)態(tài)代理、ORM映射(MyBatis的結(jié)果集映射)。獲取Class對象的三種方式:類名.class、對象.getClass()、Class.forName("全類名")。注解本質(zhì)是接口(繼承自java.lang.annotation.Annotation),通過@Target指定作用位置(如METHOD、FIELD),@Retention指定保留階段(SOURCE編譯期、CLASS類加載、RUNTIME運(yùn)行時(shí)),@Inherited允許子類繼承,@Documented提供到文檔。自定義注解需結(jié)合反射使用,例如Spring的@Autowired通過反射注入依賴。HashMap的底層實(shí)現(xiàn):JDK7為數(shù)組+鏈表,JDK8為數(shù)組+鏈表+紅黑樹(當(dāng)鏈表長度≥8且數(shù)組長度≥64時(shí),鏈表轉(zhuǎn)紅黑樹;當(dāng)紅黑樹節(jié)點(diǎn)數(shù)≤6時(shí)退化為鏈表)。核心屬性包括table(存儲(chǔ)節(jié)點(diǎn)的數(shù)組)、size(元素?cái)?shù)量)、threshold(擴(kuò)容閾值=容量×負(fù)載因子)、loadFactor(默認(rèn)0.75)。put流程:計(jì)算key的hash值((h=key.hashCode())^(h>>>16)),通過(n-1)&hash確定數(shù)組索引;若該位置為空則直接插入;若存在節(jié)點(diǎn),判斷key是否相等(equals),相等則覆蓋;否則遍歷鏈表/紅黑樹,鏈表中若長度≥8且數(shù)組長度≥64則轉(zhuǎn)紅黑樹,插入新節(jié)點(diǎn);最后檢查size是否超過threshold,超過則擴(kuò)容(舊容量×2,重新計(jì)算索引)。JDK8的優(yōu)化:hash計(jì)算減少高位碰撞,鏈表插入改為尾插(避免JDK7頭插導(dǎo)致的擴(kuò)容死鏈問題),引入紅黑樹降低查找時(shí)間復(fù)雜度(O(n)→O(logn))。ConcurrentHashMap的線程安全機(jī)制:JDK7使用分段鎖(Segment數(shù)組,每個(gè)Segment繼承ReentrantLock,默認(rèn)16段,支持16個(gè)線程并發(fā)寫);JDK8取消分段鎖,采用synchronized+CAS+Node節(jié)點(diǎn)的方式,鎖粒度細(xì)化到數(shù)組的單個(gè)節(jié)點(diǎn)(table[i]),當(dāng)插入節(jié)點(diǎn)時(shí),若該位置為空則CAS插入;若存在節(jié)點(diǎn)則synchronized鎖定該節(jié)點(diǎn),遍歷鏈表/紅黑樹插入。size()方法通過統(tǒng)計(jì)baseCount和CounterCell數(shù)組(并發(fā)時(shí)各線程累加值)的和得到。ArrayList和LinkedList的區(qū)別:ArrayList基于動(dòng)態(tài)數(shù)組,隨機(jī)訪問(get(i))時(shí)間復(fù)雜度O(1),插入/刪除(中間位置)需移動(dòng)元素,時(shí)間復(fù)雜度O(n);LinkedList基于雙向鏈表,隨機(jī)訪問需遍歷鏈表,時(shí)間復(fù)雜度O(n),插入/刪除(首尾)時(shí)間復(fù)雜度O(1)。ArrayList默認(rèn)初始容量10,擴(kuò)容時(shí)新容量為舊容量的1.5倍;LinkedList無容量限制。迭代器的fail-fast機(jī)制:當(dāng)遍歷集合時(shí),若集合結(jié)構(gòu)被修改(如add/remove,除迭代器自身的remove方法),會(huì)拋出ConcurrentModificationException。原理是集合內(nèi)部維護(hù)modCount變量(修改次數(shù)),迭代器初始化時(shí)記錄expectedModCount,每次遍歷前檢查兩者是否相等,不等則拋出異常。fail-safe機(jī)制(如CopyOnWriteArrayList)通過復(fù)制原數(shù)組進(jìn)行修改,遍歷的是原數(shù)組,不會(huì)拋出異常,但犧牲了實(shí)時(shí)性。線程的創(chuàng)建方式:繼承Thread類(重寫run())、實(shí)現(xiàn)Runnable接口(傳入Thread構(gòu)造)、實(shí)現(xiàn)Callable接口(結(jié)合FutureTask獲取返回值)。線程的六種狀態(tài)(Thread.State):NEW(新建)、RUNNABLE(可運(yùn)行,包括運(yùn)行中)、BLOCKED(阻塞,等待監(jiān)視器鎖)、WAITING(無限等待,如wait())、TIMED_WAITING(超時(shí)等待,如sleep(long))、TERMINATED(終止)。synchronized和Lock的區(qū)別:synchronized是關(guān)鍵字,JVM實(shí)現(xiàn),隱式加鎖/釋放(作用域結(jié)束自動(dòng)釋放);Lock是接口(如ReentrantLock),需手動(dòng)lock()和unlock()(通常放finally塊)。synchronized是非公平鎖(默認(rèn)),Lock支持公平鎖和非公平鎖(構(gòu)造時(shí)指定)。synchronized無法中斷等待鎖的線程,Lock的lockInterruptibly()方法可響應(yīng)中斷;synchronized只能有一個(gè)等待隊(duì)列,Lock的Condition支持多個(gè)等待隊(duì)列(如生產(chǎn)者-消費(fèi)者模型中不同條件的等待)。volatile的作用:保證可見性(變量修改后立即刷新到主內(nèi)存,其他線程讀取時(shí)從主內(nèi)存獲?。?,禁止指令重排序(通過內(nèi)存屏障實(shí)現(xiàn))。但不保證原子性(如i++操作包含讀取、修改、寫入三步,volatile無法保證這三步的原子性)。適用場景:狀態(tài)標(biāo)志(如線程終止標(biāo)志位)、單例模式的雙重檢查鎖定(防止指令重排導(dǎo)致其他線程獲取未初始化的實(shí)例)。ThreadLocal的原理:每個(gè)線程有獨(dú)立的ThreadLocalMap,鍵為ThreadLocal的弱引用(防止內(nèi)存泄漏),值為線程本地變量。set()時(shí)獲取當(dāng)前線程的ThreadLocalMap,插入鍵值對;get()時(shí)從當(dāng)前線程的Map中獲取值。內(nèi)存泄漏原因:若ThreadLocal無外部強(qiáng)引用,鍵會(huì)被GC回收,但值(強(qiáng)引用)仍存在,導(dǎo)致無法回收。解決方法:使用后調(diào)用remove()清除數(shù)據(jù)。應(yīng)用場景:數(shù)據(jù)庫連接(每個(gè)線程獨(dú)立連接)、用戶會(huì)話信息(HTTP請求中傳遞用戶ID)。AQS(AbstractQueuedSynchronizer)的核心是維護(hù)一個(gè)volatileintstate(同步狀態(tài))和CLH雙向隊(duì)列(等待線程隊(duì)列)。通過getState()、setState()、compareAndSetState()操作state,子類需實(shí)現(xiàn)tryAcquire(int)、tryRelease(int)等方法定義同步邏輯。ReentrantLock基于AQS,公平鎖會(huì)檢查隊(duì)列中是否有前驅(qū)節(jié)點(diǎn)(保證先到先得),非公平鎖直接嘗試CAS修改state(提高吞吐量)。CountDownLatch(倒計(jì)時(shí)門閂)允許一個(gè)或多個(gè)線程等待其他線程完成操作,構(gòu)造時(shí)指定計(jì)數(shù)器(如count=3),線程完成任務(wù)后調(diào)用countDown()(計(jì)數(shù)器減1),等待線程調(diào)用await()阻塞直到計(jì)數(shù)器為0。CyclicBarrier(循環(huán)屏障)允許一組線程相互等待到達(dá)屏障點(diǎn),構(gòu)造時(shí)指定線程數(shù)(如parties=5),每個(gè)線程調(diào)用await()阻塞,當(dāng)所有線程到達(dá)后屏障打開,可執(zhí)行一個(gè)Runnable(屏障動(dòng)作),支持重復(fù)使用(reset()重置計(jì)數(shù)器)。Semaphore(信號(hào)量)控制同時(shí)訪問資源的線程數(shù),構(gòu)造時(shí)指定許可數(shù)(如permits=3),線程調(diào)用acquire()獲取許可(許可數(shù)減1),release()釋放許可(許可數(shù)加1)。JVM內(nèi)存區(qū)域分為:程序計(jì)數(shù)器(記錄當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào),唯一無OOM的區(qū)域)、Java虛擬機(jī)棧(每個(gè)方法對應(yīng)一個(gè)棧幀,存儲(chǔ)局部變量表、操作數(shù)棧等,異常:StackOverflowError(棧深度超限制)、OutOfMemoryError(棧擴(kuò)展失?。⒈镜胤椒#楸镜胤椒ǚ?wù),與虛擬機(jī)棧類似)、堆(存儲(chǔ)對象實(shí)例和數(shù)組,最大的內(nèi)存區(qū)域,異常:OutOfMemoryError)、方法區(qū)(存儲(chǔ)類信息、常量、靜態(tài)變量等,JDK7前為永久代(PermGen),JDK8后為元空間(MetaSpace,使用本地內(nèi)存),異常:OutOfMemoryError)。堆的分代收集理論:對象朝生夕滅(年輕代)、少數(shù)對象存活(老年代)。年輕代分為Eden區(qū)和兩個(gè)Survivor區(qū)(S0、S1,默認(rèn)比例8:1:1),新對象優(yōu)先分配在Eden區(qū),MinorGC(YoungGC)時(shí)回收Eden和Survivor中存活的對象(復(fù)制到另一個(gè)Survivor區(qū),年齡+1,年齡≥閾值(默認(rèn)15)則進(jìn)入老年代)。老年代存儲(chǔ)長期存活的對象或大對象(超過-XX:PretenureSizeThreshold的對象直接進(jìn)入老年代),觸發(fā)FullGC(MajorGC)的場景:老年代空間不足、永久代/元空間不足、顯式調(diào)用System.gc()(可能觸發(fā))。類加載機(jī)制分為加載、鏈接(驗(yàn)證、準(zhǔn)備、解析)、初始化三個(gè)階段。加載:通過類加載器將class文件加載到內(nèi)存,提供Class對象;驗(yàn)證:檢查字節(jié)碼格式、語義等是否合法;準(zhǔn)備:為靜態(tài)變量分配內(nèi)存并設(shè)置初始值(如int初始為0,引用初始為null);解析:將符號(hào)引用替換為直接引用(如類、方法的引用);初始化:執(zhí)行類構(gòu)造器<clinit>()方法(靜態(tài)變量賦值和靜態(tài)代碼塊的合并),觸發(fā)時(shí)機(jī):new對象、調(diào)用靜態(tài)方法/變量(非final)、反射獲取類、主類(包含main方法的類)。雙親委派模型:類加載器收到加載請求時(shí),先委托給父類加載器(引導(dǎo)類加載器→擴(kuò)展類加載器→應(yīng)用類加載器),父類無法加載時(shí)再自己加載。好處:避免重復(fù)加載(同一類由同一加載器加載)、保證核心類的安全性(如java.lang.String不會(huì)被自定義加載器篡改)。破壞雙親委派的場景:Tomcat的WebappClassLoader(每個(gè)Web應(yīng)用有獨(dú)立的類加載器,優(yōu)先加載自己的類)、OSGi的模塊化加載(動(dòng)態(tài)加載/卸載類)。垃圾回收算法:標(biāo)記-清除(Mark-Sweep):標(biāo)記存活對象,清除未標(biāo)記對象,缺點(diǎn)是內(nèi)存碎片;標(biāo)記-復(fù)制(Mark-Copy):將內(nèi)存分為兩塊,標(biāo)記存活對象復(fù)制到另一塊,清空原塊,適用于年輕代(存活少);標(biāo)記-整理(Mark-Compact):標(biāo)記存活對象,將其向一端移動(dòng),整理內(nèi)存,適用于老年代(存活多)。垃圾收集器:Serial(年輕代,單線程,STW)、ParNew(年輕代,多線程,配合CMS使用)、ParallelScavenge(年輕代,多線程,目標(biāo)是吞吐量(運(yùn)行用戶代碼時(shí)間/(用戶代碼+GC時(shí)間)));CMS(老年代,多線程,目標(biāo)是低停頓,流程:初始標(biāo)記(STW)→并發(fā)標(biāo)記→重新標(biāo)記(STW)→并發(fā)清除,缺點(diǎn):內(nèi)存碎片、浮動(dòng)垃圾(并發(fā)標(biāo)記時(shí)新產(chǎn)生的垃圾需下次收集));G1(全堆收集,分Region(大小相等的區(qū)域),跟蹤每個(gè)Region的回收價(jià)值(存活對象少),優(yōu)先回收價(jià)值大的Region,流程:初始標(biāo)記→并發(fā)標(biāo)記→最終標(biāo)記→篩選回收);ZGC(低延遲,使用顏色指針和讀屏障,停頓時(shí)間不超過10ms,支持TB級(jí)內(nèi)存)。內(nèi)存泄漏的場景:長生命周期對象持有短生命周期對象的引用(如靜態(tài)集合保存臨時(shí)對象)、ThreadLocal未remove()、未關(guān)閉的資源(如IO流、數(shù)據(jù)庫連接)、監(jiān)聽器/回調(diào)未注銷(如注冊事件監(jiān)聽器后未移除)。排查方法:使用JProfiler、Arthas等工具提供堆轉(zhuǎn)儲(chǔ)文件(heapdump),分析對象引用鏈,定位未被回收的對象。SpringIOC(控制反轉(zhuǎn))的核心是將對象的創(chuàng)建、依賴注入交給容器管理,減少代碼耦合。實(shí)現(xiàn)方式:通過BeanFactory(基礎(chǔ)容器)或ApplicationContext(擴(kuò)展容器,支持國際化、事件發(fā)布等)。依賴注入的方式:構(gòu)造器注入(強(qiáng)制依賴)、setter注入(可選依賴)、字段注入(@Autowired)。AOP(面向切面編程)通過動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理或CGLIB)將橫切關(guān)注點(diǎn)(如日志、事務(wù))與業(yè)務(wù)邏輯分離,核心概念:切面(Aspect)、連接點(diǎn)(JoinPoint)、切點(diǎn)(Pointcut)、通知(Advice:前置、后置、返回、異常、環(huán)繞)、引入(Introduction)、目標(biāo)對象(Target)、代理(Proxy)、織入(Weaving)。Bean的生命周期:實(shí)例化(調(diào)用構(gòu)造方法)→屬性注入(依賴注入)→初始化前(@PostConstruct或BeanPostProcessor的postProcessBeforeInitialization)→初始化(實(shí)現(xiàn)InitializingBean的afterPropertiesSet或自定義init-method)→初始化后(BeanPostProcessor的postProcessAfterInitialization)→銷毀前(@PreDestroy或DisposableBean的destroy或自定義destroy-method)→銷毀。Bean的作用域:singleton(單例,默認(rèn),容器中僅一個(gè)實(shí)例)、prototype(原型,每次獲取新實(shí)例)、request(HTTP請求作用域,僅Web環(huán)境)、session(HTTP會(huì)話作用域)、application(ServletContext作用域)。循環(huán)依賴的解決:Spring通過三級(jí)緩存(singletonObjects:單例池,存儲(chǔ)已初始化完成的Bean;earlySingletonObjects:存儲(chǔ)提前暴露的Bean(未完成初始化);singletonFactories:存儲(chǔ)Bean工廠,提供提前暴露的Bean)解決單例Bean的循環(huán)依賴。例如A依賴B,B依賴A:創(chuàng)建A時(shí)將A的工廠(()->getEarlyBeanReference)放入singletonFactories;A注入B時(shí)觸發(fā)B的創(chuàng)建,B注入A時(shí)從A的工廠獲取早期引用(放入earlySingletonObjects),B初始化完成后放入singletonObjects;A獲取B后完成初始化,放入singletonObjects。注意:構(gòu)造器注入和prototype作用域的循環(huán)依賴無法解決(構(gòu)造器注入時(shí)無法提前暴露Bean,prototype不緩存)。Spring事務(wù)的傳播行為:REQUIRED(默認(rèn),當(dāng)前有事務(wù)則加入,無則新建)、REQUIRES_NEW(新建事務(wù),掛起當(dāng)前事務(wù))、SUPPORTS(當(dāng)前有事務(wù)則加入,無則非事務(wù)執(zhí)行)、NOT_SUPPORTED(非事務(wù)執(zhí)行,掛起當(dāng)前事務(wù))、MANDATORY(當(dāng)前必須有事務(wù),無則拋異常)、NEVER(當(dāng)前必須無事務(wù),有則拋異常)、NESTED(嵌套事務(wù),基于保存點(diǎn),回滾僅回滾嵌套部分)。隔離級(jí)別:DEFAULT(使用數(shù)據(jù)庫默認(rèn),如MySQL的可重復(fù)讀)、READ_UNCOMMITTED(讀未提交,可能臟讀)、READ_COMMITTED(讀已提交,避免臟讀)、REPEATABLE_READ(可重復(fù)讀,避免不可重復(fù)讀,MySQL默認(rèn))、SERIALIZABLE(串行化,最高隔離,避免幻讀,性能低)。SpringMVC的執(zhí)行流程:客戶端發(fā)送請求→DispatcherServlet(前端控制器)接收→HandlerMapping(處理器映射)根據(jù)URL找到Handler(控制器方法)→HandlerAdapter(處理器適配器)調(diào)用Handler→Handler處理請求并返回ModelAndView→ViewResolver(視圖解析器)解析視圖名→View(視圖)渲染數(shù)據(jù)→響應(yīng)客戶端。核心組件:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver、ModelAndView、View。@Autowired和@Resource的區(qū)別:@Autowired是Spring注解,默認(rèn)按類型注入,可通過@Qualifier指定名稱;@Resource是JSR-250注解(Java標(biāo)準(zhǔn)),默認(rèn)按名稱注入(name屬性),無名稱則按類型。@Autowired可用于構(gòu)造器、方法、字段,@Resource用于字段和setter方法。SpringBoot自動(dòng)配置的原理:@SpringBootApplication包含@EnableAutoConfiguration,該注解通過SpringFactoriesLoader加載META-INF/spring.factories中的自動(dòng)配置類(如DataSourceAutoConfiguration)。每個(gè)自動(dòng)配置類使用@Conditional系列注解(如@ConditionalOnClass(類存在時(shí)生效)、@ConditionalOnMissingBean(無該Bean時(shí)生效))判斷是否生效,從而實(shí)現(xiàn)按需加載。開發(fā)者可通過perties配置參數(shù)覆蓋默認(rèn)值(如spring.datasource.url)。MyBatis動(dòng)態(tài)SQL的常用標(biāo)簽:<iftest="條件">(條件判斷)、<where>(自動(dòng)處理AND/OR前綴)、<set>(自動(dòng)處理逗號(hào)后綴)、<foreachcollection="集合"item="元素"open="("separator=","close=")">(遍歷集合)、<choose><when><otherwise>(類似switch-case)。例如查詢用戶列表,可選參數(shù)姓名和年齡:<selectid="selectUsers"resultType="User">SELECTFROMuser<where><iftest="name!=null">name={name}</if><iftest="age!=null">ANDage={age}</if></where></select>{}和${}的區(qū)別:{}是預(yù)編譯處理(PreparedStatement),防止SQL注入,將參數(shù)替換為占位符?;${}是字符串替換(Statement),直接拼接參數(shù),用于表名、列名等動(dòng)態(tài)字段(需手動(dòng)過濾)。例如排序時(shí)使用${order}指定排序列:ORDERBY${order}。MyBatis一級(jí)緩存(SqlSession級(jí)):同一SqlSession中查詢相同語句(相同參數(shù)、相同Mapper方法)會(huì)緩存結(jié)果,SqlSession關(guān)閉或執(zhí)行增刪改(或手動(dòng)clearCache())時(shí)清空。二級(jí)緩存(Mapper級(jí)):多個(gè)SqlSession共享,需在Mapper.xml中配置<cache/>,并開啟全局緩存(mybatis.configuration.cache-enabled=true),緩存鍵為(namespace+sqlId+參數(shù)),適用于查詢多、修改少的場景(如字典表)。MyBatis插件機(jī)制通過動(dòng)態(tài)代理實(shí)現(xiàn),可攔截Executor(執(zhí)行器)、ParameterHandler(參數(shù)處理器)、ResultSetHandler(結(jié)果集處理器)、StatementHandler(語句處理器)的方法。自定義插件需實(shí)現(xiàn)Interceptor接口,使用@Intercepts和@Signature注解指定攔截的方法,通過代理對象增強(qiáng)功能(如分頁插件PageHelper)。MyBatis與Hibernate的區(qū)別:MyBatis是半ORM(對象關(guān)系映射),需手動(dòng)編寫SQL,靈活性高,適合復(fù)雜查詢;Hibernate是全ORM,自動(dòng)提供SQL,封裝性好,適合簡單CRUD。MyBatis學(xué)習(xí)成本低(熟悉SQL即可),Hibernate需學(xué)習(xí)HQL和緩存機(jī)制。MyBatis性能可控(手動(dòng)優(yōu)化SQL),Hibernate可能因自動(dòng)提供SQL性能低下(如N+1查詢問題)。MySQL索引類型:主鍵索引(唯一標(biāo)識(shí),自動(dòng)創(chuàng)建,InnoDB主鍵索引是聚簇索引,數(shù)據(jù)按主鍵順序存儲(chǔ))、唯一索引(字段值唯一,允許多個(gè)null)、普通索引(無唯一性約束)、全文索引(用于文本搜索,MyISAM和InnoDB(5.6+)支持)、組合索引(多字段聯(lián)合索引,遵循最左匹配原則)。索引優(yōu)化原則:選擇區(qū)分度高的字段(如用戶ID比性別好)、避免在小基數(shù)字段(如狀態(tài)字段)建索引、組合索引將高頻查詢字段放前面、覆蓋索引(查詢字段包含在索引中,避免回表)。事務(wù)的ACID特性:原子性(Atomicity,操作要么全成功要么全失敗)、一致性(Consistency,從一個(gè)一致狀態(tài)到另一個(gè)一致狀態(tài))、隔離性(Isolation,事務(wù)間互不干擾)、持久性(Durability,提交后數(shù)據(jù)永久保存)。隔離級(jí)別:讀未提交(READUNCOMMITTED,允許臟讀)、讀已提交(READCOMMITTED,避免臟讀,可能不可重復(fù)讀,Oracle默認(rèn))、可重復(fù)讀(REPEATABLEREAD,避免不可重復(fù)讀,可能幻讀,MySQL默認(rèn))、串行化(SERIALIZABLE,避免幻讀,性能最差)。臟讀(讀取未提交的修改)、不可重復(fù)讀(同一事務(wù)兩次讀取結(jié)果不同)、幻讀(同一事務(wù)兩次查詢返回行數(shù)不同)。索引失效的場景:使用!=或<>(可能全表掃描)、字段參與計(jì)算(如WHEREage+1=20)、類型不匹配(如字符串字段用數(shù)字查詢未加引號(hào),導(dǎo)致全表掃描)、左模糊查詢(LIKE'%abc')、OR條件中有未索引的字段(如id=1ORname='a',若name無索引則全表掃描)、組合索引不滿足最左匹配(如索引(a,b,c),查詢b=1或c=1失效)、數(shù)據(jù)分布不均(如性別字段只有兩個(gè)值,索引效果差)。慢查詢優(yōu)化步驟:開啟慢查詢?nèi)罩荆╯low_query_log=ON,long_query_time=1),記錄執(zhí)行時(shí)間超過閾值的SQL;使用EXPLAIN分析慢SQL的執(zhí)行計(jì)劃(關(guān)注type(最好為const,最差為ALL)、key(使用的索引)、rows(掃描行數(shù))、Extra(如Usingfilesort(文件排序)、Usingtemporary(臨時(shí)表)));優(yōu)化索引(添加組合索引、覆蓋索引)、重寫SQL(避免子查詢改用JOIN、減少OR條件)、分頁優(yōu)化(如記錄上次查詢的最大ID,使用WHEREid>last_idLIMIT10)。InnoDB和MyISAM的區(qū)別:InnoDB支持事務(wù)(默認(rèn)可重復(fù)讀)、行級(jí)鎖(并發(fā)高)、外鍵約束;MyISAM不支持事務(wù),表級(jí)鎖(并發(fā)低),無外鍵。InnoDB的聚簇索引(主鍵索引)存儲(chǔ)數(shù)據(jù),輔助索引(非主鍵)存儲(chǔ)主鍵值(需回表查詢);MyISAM的索引和數(shù)據(jù)分開存儲(chǔ)(非聚簇索引)。InnoDB有MVCC(多版本并發(fā)控制),MyISAM無。InnoDB適合高并發(fā)、事務(wù)場景(如訂單系統(tǒng)),MyISAM適合讀多寫少、無事務(wù)場景(如日志表)。分庫分表的策略:垂直分庫(按業(yè)務(wù)拆分,如用戶庫、訂單庫)、垂直分表(按字段拆分,如用戶表拆分為用戶基本信息表和用戶詳細(xì)信息表)、水平分庫(按規(guī)則(如ID取模、范圍)將數(shù)據(jù)分散到不同庫)、水平分表(將大表拆分為多個(gè)小表,如order_1、order_2)。路由算法:哈希取模(簡單,擴(kuò)容需數(shù)據(jù)遷移)、范圍劃分(如ID1-1000到表1,1001-2000到表2,擴(kuò)容方便,數(shù)據(jù)分布不均)、雪花算法(提供全局唯一ID,包含時(shí)間戳、機(jī)器ID等,可按時(shí)間范圍分庫)。單例模式的實(shí)現(xiàn):餓漢式(類加載時(shí)創(chuàng)建,線程安全):publicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}懶漢式(線程不安全,多線程下可能創(chuàng)建多個(gè)實(shí)例):publicclassSingleton{privatestaticSingletonINSTANCE;privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){INSTANCE=newSingleton();}returnINSTANCE;}}線程安全的懶漢式(synchronized,效率低):publicstaticsynchronizedSingletongetInstance(){if(INSTANCE==null){INSTANCE=newSingleton();}returnINSTANCE;}雙重檢查鎖定(DCL,線程安全,效率高,需volatile防止指令重排):publicclassSingleton{privatestaticvolatileSingletonINSTANCE;//volatile禁止指令重排privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){//第一次檢查,減少鎖競爭synchronized(Singleton.class){if(INSTANCE==null){//第二次檢查,防止多線程同時(shí)通過第一次檢查INSTANCE=newSingleton();}}}returnINSTANCE;}}枚舉式(最安全,線程安全,防止反射和反序列化攻擊):publicenumSingleton{INSTANCE;publicvoidmethod(){}}工廠模式:簡單工廠(靜態(tài)工廠,根據(jù)參數(shù)創(chuàng)建不同對象,違反開閉原則):publicclassSimpleFactory{publicstaticProductcreateProduct(Stringtype){if("A".equals(type)){returnnewProductA();}elseif("B".equals(type)){returnnewProductB();}thrownewIllegalArgumentException("無效類型");}}工廠方法(每個(gè)產(chǎn)品對應(yīng)一個(gè)工廠,符合開閉原則):publicinterfaceFactory{ProductcreateProduct();}publicclassProductAFactoryimplementsFactory{publicProductcreateProduct(){returnnewProductA();}}抽象工廠(創(chuàng)建產(chǎn)品族,如不同操作系統(tǒng)的按鈕和文本框):publicinterfaceAbstractFactory{ButtoncreateButton();TextBoxcreateTextBox();}publicclassWindowsFactoryimplementsAbstractFactory{publicButtoncreateButton(){returnnewWindowsButton();}publicTextBoxcreateTextBox(){returnnewWindowsTextBox();}}代理模式:靜態(tài)代理(編譯期提供,代理類和目標(biāo)類實(shí)現(xiàn)同一接口):publicinterfaceSubject{voidrequest();}publicclassRealSubjectimplementsSubject{publicvoidrequest(){System.out.println("真實(shí)對象處理請求");}}publicclassStaticProxyimplementsSubject{privateSubjectrealSubject;publicStaticProxy(SubjectrealSubject){this.realSubject=realSubject;}publicvoidrequest(){System.out.println("代理前處理");realSubject.request();System.out.println("代理后處理");}}動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理,基于接口,通過InvocationHandler實(shí)現(xiàn)):publicclassJdkProxyimplementsInvocationHandler{privateObjecttarget;publicJdkProxy(Objecttarget){this.target=target;}publicObjectinvoke(O

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論