2025年軟件工程師Java后端開(kāi)發(fā)面試真題解析及答案_第1頁(yè)
2025年軟件工程師Java后端開(kāi)發(fā)面試真題解析及答案_第2頁(yè)
2025年軟件工程師Java后端開(kāi)發(fā)面試真題解析及答案_第3頁(yè)
2025年軟件工程師Java后端開(kāi)發(fā)面試真題解析及答案_第4頁(yè)
2025年軟件工程師Java后端開(kāi)發(fā)面試真題解析及答案_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

2025年軟件工程師Java后端開(kāi)發(fā)面試練習(xí)題解析及答案1.單選題(每題2分,共20分)1.1在JDK17中,下列關(guān)于`var`關(guān)鍵字的描述正確的是A.可用于成員變量聲明B.可用于方法形參列表C.可用于局部變量聲明且必須立即初始化D.可用于catch子句中的異常變量聲明答案:C解析:JDK10引入的`var`僅限局部變量,且必須同時(shí)初始化;編譯器通過(guò)右側(cè)表達(dá)式推斷類型,不可用于成員、形參、catch。1.2關(guān)于SpringBoot3.0自動(dòng)裝配,以下說(shuō)法正確的是A.`@EnableAutoConfiguration`已被廢棄B.`spring.factories`仍被優(yōu)先加載C.`METAINF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`是新的裝配入口D.自動(dòng)裝配類必須加`@Component`答案:C解析:SpringBoot2.7起逐步遷移至`AutoConfiguration.imports`,3.0完全移除`spring.factories`對(duì)自動(dòng)裝配的支持。1.3在MySQL8.0中,默認(rèn)的事務(wù)隔離級(jí)別是A.READUNCOMMITTEDB.READCOMMITTEDC.REPEATABLEREADD.SERIALIZABLE答案:C解析:InnoDB默認(rèn)隔離級(jí)別為REPEATABLEREAD,通過(guò)MVCC+NextKeyLock解決幻讀。1.4下列關(guān)于JVMG1垃圾收集器的描述,錯(cuò)誤的是A.支持Regionbased內(nèi)存布局B.可設(shè)置最大停頓時(shí)間目標(biāo)C.YoungGC采用復(fù)制算法D.FullGC一定使用單線程答案:D解析:G1的FullGC在JDK10之后已改為并行多線程,僅在極端退化場(chǎng)景下觸發(fā)。1.5在Java并發(fā)包中,`StampedLock`的`tryOptimisticRead()`失敗后會(huì)A.直接拋出`IllegalMonitorStateException`B.自動(dòng)升級(jí)為悲觀讀鎖C.返回0,需用戶自行決策D.觸發(fā)`System.gc()`答案:C解析:樂(lè)觀讀返回非0戳,校驗(yàn)失敗時(shí)返回0,需用戶重新獲取悲觀鎖。1.6使用SpringSecurity6時(shí),下列哪種配置可關(guān)閉CSRF防護(hù)A.`http.csrf().disable()`B.`http.csrf(AbstractHttpConfigurer::disable)`C.`http.headers().frameOptions().disable()`D.`http.anonymous().disable()`答案:B解析:SpringSecurity6移除`csrf()`返回實(shí)例方法,改用LambdaDSL。1.7在Redis7.0中,可實(shí)現(xiàn)“流”數(shù)據(jù)持久化的命令是A.`RDBSAVE`B.`XADD`C.`XAUTOCLAIM`D.`XREADGROUP`答案:B解析:`XADD`向Stream追加消息,觸發(fā)AOF追加或RDB快照,實(shí)現(xiàn)持久化。1.8關(guān)于虛擬線程(ProjectLoom,JDK21生產(chǎn)可用),正確的是A.虛擬線程由OS內(nèi)核調(diào)度B.創(chuàng)建100萬(wàn)虛擬線程需100萬(wàn)條內(nèi)核線程C.虛擬線程棧幀存儲(chǔ)在堆外內(nèi)存D.虛擬線程阻塞操作不會(huì)釘住載體線程答案:D解析:虛擬線程由JVM用戶態(tài)調(diào)度器管理,阻塞時(shí)載體線程被釋放,可繼續(xù)運(yùn)行其他虛擬線程。1.9在Kafka3.5中,__consumer_offsets主題的默認(rèn)分區(qū)數(shù)是A.10B.20C.50D.100答案:C解析:Kafka0.10起默認(rèn)50分區(qū),可通過(guò)`offsets.topic.num.partitions`調(diào)整。1.10使用JPA3.1時(shí),下列注解組合可完成邏輯刪除A.`@SQLDelete(sql="UPDATEuserSETdeleted=1WHEREid=?")`B.`@Where(clause="deleted=0")`C.A+B同時(shí)使用D.`@DynamicUpdate`答案:C解析:Hibernate通過(guò)`@SQLDelete`改寫(xiě)DELETE語(yǔ)句,`@Where`過(guò)濾軟刪除記錄,二者配合實(shí)現(xiàn)邏輯刪除。2.多選題(每題3分,共15分)2.1以下哪些屬于Java內(nèi)存模型中的happensbefore規(guī)則A.程序次序規(guī)則B.管程鎖定規(guī)則C.volatile變量規(guī)則D.線程中斷規(guī)則E.對(duì)象終結(jié)規(guī)則答案:ABCE解析:中斷規(guī)則不屬于JMM正式happensbefore規(guī)則。2.2關(guān)于SpringCloud2023.x組件,正確的有A.SpringCloudGateway支持HTTP/3B.SpringCloudLoadBalancer默認(rèn)使用RibbonC.SpringCloudConfig支持對(duì)稱加密與非對(duì)稱加密D.SpringCloudStream4.0函數(shù)式編程模型綁定器支持Kafka/RabbitMQE.SpringCloudNetflix除Eureka外全部進(jìn)入維護(hù)模式答案:ACDE解析:LoadBalancer已取代Ribbon,Ribbon進(jìn)入維護(hù)。2.3在Dockerfile中,可提升鏡像構(gòu)建緩存命中率的做法有A.將變動(dòng)頻率低的指令放在前面B.使用`nocache`強(qiáng)制刷新C.多階段構(gòu)建中把依賴下載與編譯分離D.復(fù)制`pom.xml`先下載依賴再?gòu)?fù)制源碼E.使用`COPY./app`一次性復(fù)制所有文件答案:ACD解析:B禁用緩存,E導(dǎo)致任何文件變動(dòng)都失效緩存。2.4以下哪些算法可用于分布式ID生成A.UUIDv4B.SnowflakeC.LeafsegmentD.RedisINCRE.MySQLAUTO_INCREMENT答案:ABCD解析:AUTO_INCREMENT非分布式,需改造為號(hào)段模式。2.5關(guān)于Netty4.1性能調(diào)優(yōu),正確的有A.開(kāi)啟`Dty.allocator.type=pooled`B.設(shè)置`Dty.recycler.maxCapacityPerThread=0`禁用對(duì)象池C.使用`Epoll`替代NIO可提升Linux吞吐量D.業(yè)務(wù)Handler應(yīng)執(zhí)行耗時(shí)操作防止I/O線程阻塞E.寫(xiě)大數(shù)據(jù)包前應(yīng)調(diào)用`channel.isWritable()`做流控答案:ACE解析:B禁用對(duì)象池反而降低性能;D錯(cuò)誤,耗時(shí)操作應(yīng)移交業(yè)務(wù)線程池。3.填空題(每空2分,共20分)3.1在Linux下查看Java進(jìn)程JVM標(biāo)志參數(shù)的命令是`jcmd<pid>VM.flags`3.2Spring事務(wù)傳播行為中,若當(dāng)前不存在事務(wù)就新建,存在則加入,應(yīng)使用`REQUIRED`3.3MySQL8.0通過(guò)`innodb_dedicated_server=ON`可自動(dòng)計(jì)算`innodb_buffer_pool_size`3.4RedisCluster槽總數(shù)是`16384`3.5在Git中,撤銷已push到遠(yuǎn)程的commit,應(yīng)使用`gitrevert`3.6JDK17中,啟用ZGC的JVM參數(shù)為`XX:+UseZGC`3.7在Maven中,排除傳遞性依賴的標(biāo)簽是`<exclusions>`3.8使用Jackson將LocalDateTime序列化為Unix秒,需注冊(cè)`JavaTimeModule`并禁用`WRITE_DATES_AS_TIMESTAMPS`3.9在Kafka中,消費(fèi)者組重平衡觸發(fā)條件有:①新消費(fèi)者加入②消費(fèi)者離開(kāi)③訂閱Topic分區(qū)數(shù)變化④`session.timeout.ms`超時(shí)3.10當(dāng)HTTP響應(yīng)碼為`429`時(shí),含義是TooManyRequests4.判斷題(每題1分,共10分)4.1`synchronized`在JDK6之后默認(rèn)仍為重量級(jí)鎖答案:錯(cuò)誤,JDK6引入偏向鎖、輕量級(jí)鎖,鎖升級(jí)機(jī)制大幅降低開(kāi)銷。4.2在SpringMVC中,`@RequestBody`只能綁定JSON答案:錯(cuò)誤,可綁定XML、Form、Protobuf等,取決于`HttpMessageConverter`。4.3使用MyBatis二級(jí)緩存時(shí),默認(rèn)開(kāi)啟答案:錯(cuò)誤,需`<cache/>`標(biāo)簽或`@CacheNamespace`顯式開(kāi)啟。4.4在JPA中,`EntityManager`的`persist`方法對(duì)游離態(tài)對(duì)象會(huì)拋`IllegalArgumentException`答案:正確。4.5RedisString底層采用SDS,長(zhǎng)度小于1MB時(shí)擴(kuò)容加倍,大于則每次加1MB答案:正確。4.6Linux`vm.swappiness=0`表示禁用交換分區(qū)答案:錯(cuò)誤,0表示盡量不使用,而非完全禁用。4.7在Docker中,`ENTRYPOINT`與`CMD`同時(shí)出現(xiàn)時(shí),CMD作為默認(rèn)參數(shù)答案:正確。4.8使用Netty時(shí),`ChannelHandlerContext.fireChannelRead()`會(huì)從頭開(kāi)始重新傳播事件答案:錯(cuò)誤,從當(dāng)前Handler的下一個(gè)開(kāi)始。4.9在JDK21中,虛擬線程的`ThreadLocal`性能低于平臺(tái)線程答案:正確,虛擬線程數(shù)量巨大時(shí),`ThreadLocal`哈希表成為瓶頸,建議用`ScopedValue`。4.10在SpringSecurity中,`PasswordEncoder`的`matches`方法線程安全答案:正確,官方實(shí)現(xiàn)如`BCryptPasswordEncoder`無(wú)狀態(tài)且線程安全。5.簡(jiǎn)答題(每題10分,共30分)5.1描述一次完整的MySQLInnoDB聚簇索引查找二級(jí)索引回表過(guò)程,并說(shuō)明如何通過(guò)覆蓋索引避免回表答案:1)InnoDB主鍵即為聚簇索引,葉子節(jié)點(diǎn)存儲(chǔ)整行數(shù)據(jù);二級(jí)索引葉子節(jié)點(diǎn)存儲(chǔ)索引列+主鍵值。2)SQL:`SELECTageFROMuserWHEREname='Alice'`;若name為二級(jí)索引,執(zhí)行流程:a.在name索引樹(shù)根節(jié)點(diǎn)二分查找,逐層定位到葉子節(jié)點(diǎn),獲得主鍵值`id=100`;b.使用主鍵100回到聚簇索引,再次走樹(shù)搜索,讀取整行,取出age返回,此過(guò)程稱“回表”。3)覆蓋索引:將查詢所需列全部納入二級(jí)索引,如建立`(name,age)`聯(lián)合索引,則葉子節(jié)點(diǎn)已包含age,無(wú)需回表,減少一次隨機(jī)I/O,提升性能。Explain中`Extra`顯示`Usingindex`。5.2說(shuō)明SpringBean生命周期中`BeanPostProcessor`與`InstantiationAwareBeanPostProcessor`的差異,并給出實(shí)現(xiàn)自定義注解`@EncryptField`完成字段敏感信息加解密的代碼骨架答案:1)`BeanPostProcessor`提供`postProcessBeforeInitialization`/`postProcessAfterInitialization`,作用于Bean實(shí)例化與屬性填充完成之后;`InstantiationAwareBeanPostProcessor`繼承自`BeanPostProcessor`,額外提供`postProcessBeforeInstantiation`/`postProcessAfterInstantiation`,可在實(shí)例化前后干預(yù),如創(chuàng)建代理對(duì)象。2)代碼骨架:```java@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public@interfaceEncryptField{}@ComponentpublicclassEncryptProcessorimplementsBeanPostProcessor{@OverridepublicObjectpostProcessAfterInitialization(Objectbean,StringbeanName){ReflectionUtils.doWithFields(bean.getClass(),field>{if(field.isAnnotationPresent(EncryptField.class)){field.setAccessible(true);try{Stringraw=(String)field.get(bean);if(raw!=null){Stringenc=AES.encrypt(raw,KEY);field.set(bean,enc);}}catch(IllegalAccessExceptione){thrownewRuntimeException(e);}}});returnbean;}}```解密可在`@JsonComponent`的序列化器中完成,實(shí)現(xiàn)透明加解密。5.3說(shuō)明Redis分布式鎖的Redlock算法步驟,并指出其在Java中的實(shí)現(xiàn)缺陷及工程級(jí)替代方案答案:1)Redlock算法步驟:a.獲取當(dāng)前毫秒時(shí)間T1;b.依次向N個(gè)獨(dú)立Redis節(jié)點(diǎn)(奇數(shù)且≥3)使用相同key和隨機(jī)值`uuid`執(zhí)行`SETkeyuuidNXPX30000`;c.計(jì)算獲取鎖消耗時(shí)間`T2T1`,若小于超時(shí)時(shí)間且成功節(jié)點(diǎn)數(shù)≥N/2+1,則鎖有效;d.鎖有效期為`expire(T2T1)`;e.釋放時(shí)向所有節(jié)點(diǎn)發(fā)送Lua腳本:`ifredis.call("get",KEYS[1])==ARGV[1]thenreturnredis.call("del",KEYS[1])elsereturn0end`。2)缺陷:網(wǎng)絡(luò)延遲與GC導(dǎo)致時(shí)鐘漂移,可能兩個(gè)客戶端同時(shí)認(rèn)為持有鎖;無(wú)fencingtoken,無(wú)法防止消息延遲;failover期間原主節(jié)點(diǎn)未同步完成,出現(xiàn)鎖丟失。3)工程替代:使用Redis7的`BLMPOP`+`Redisson`的`RSemaphore`實(shí)現(xiàn)可重入鎖;基于etcd或ZooKeeper的分布式鎖,提供線性一致性;在業(yè)務(wù)層引入冪等token或數(shù)據(jù)庫(kù)唯一索引,確保即使鎖失效也不會(huì)超賣(mài)。6.編程題(15分)6.1場(chǎng)景:高并發(fā)秒殺,商品庫(kù)存1000件,允許超賣(mài)損失≤5件。要求:使用SpringBoot3.2+RedisCluster+MySQL8.0;接口`POST/seckill/{itemId}`,返回訂單號(hào)或“已售罄”;每秒并發(fā)5萬(wàn)請(qǐng)求,TP99≤200ms;提供完整Lua腳本、核心Service代碼、數(shù)據(jù)庫(kù)DDL,并說(shuō)明如何驗(yàn)證不超賣(mài)。答案:1)數(shù)據(jù)庫(kù)DDL```sqlCREATETABLEitem(idBIGINTPRIMARYKEY,stockINTNOTNULL,versionBIGINTNOTNULL,INDEXidx_version(version))ENGINE=InnoDB;CREATETABLEseckill_order(idBIGINTAUTO_INCREMENTPRIMARYKEY,item_idBIGINTNOTNULL,user_idBIGINTNOTNULL,UNIQUEKEYuk_item_user(item_id,user_id));```2)RedisLua腳本(stock.lua)```lualocalitemKey=KEYS[1]localuserKey=KEYS[2]localstock=tonumber(redis.call('get(itemKey)or0))ifstock<=0thenreturn1endlocalexist=redis.call('sismember',userKey,ARGV[1])ifexist==1thenreturn2endredis.call('decr',itemKey)redis.call('sadd',userKey,ARGV[1])returnstock1```3)Service層```java@ServicepublicclassSeckillService{@AutowiredprivateStringRedisTemplateredis;@AutowiredprivateSeckillOrderRepositoryorderRepo;privatestaticfinalStringLUA_SHA;static{Stringlua="localk1=KEYS[1];localk2=KEYS[2];localstock=tonumber(redis.call('get',k1)or0);"+"ifstock<=0thenreturn1end;"+"ifredis.call('sismember',k2,ARGV[1])==1thenreturn2end;"+"redis.call('decr',k1);redis.call('sadd',k2,ARGV[1]);returnstock1

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論