2025校招Java軟件開發(fā)工程師筆試題及答案_第1頁
2025校招Java軟件開發(fā)工程師筆試題及答案_第2頁
2025校招Java軟件開發(fā)工程師筆試題及答案_第3頁
2025校招Java軟件開發(fā)工程師筆試題及答案_第4頁
2025校招Java軟件開發(fā)工程師筆試題及答案_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2025校招Java軟件開發(fā)工程師筆試題及答案1.單項選擇題(每題2分,共20分)1.1在JDK21的虛擬線程(VirtualThread)模型下,下列哪一項描述最準(zhǔn)確地反映了synchronized關(guān)鍵字的行為變化?A.虛擬線程進入synchronized塊時會固定(pin)到平臺線程,導(dǎo)致調(diào)度器無法卸載虛擬線程B.虛擬線程一旦進入synchronized塊,JVM自動將其轉(zhuǎn)換為平臺線程,避免阻塞C.synchronized在虛擬線程中已被廢棄,推薦使用ReentrantLock完全替代D.虛擬線程的synchronized競爭完全由用戶態(tài)調(diào)度器處理,不再依賴操作系統(tǒng)互斥量答案:A解析:JDK21中,虛擬線程在進入synchronized代碼塊或方法時,若監(jiān)視器已被占用,則當(dāng)前虛擬線程會被“固定”到承載它的平臺線程,導(dǎo)致調(diào)度器無法卸載該虛擬線程,從而可能削弱虛擬線程的可擴展性。ReentrantLock內(nèi)部使用CAS+VarHandle,不固定虛擬線程,因此官方推薦在高并發(fā)場景下優(yōu)先使用。1.2給定以下基于SpringBoot3.2的REST接口:```java@RestController@RequestMapping("/api")publicclassOrderController{@GetMapping("/order/{id}")publicOrderget(@PathVariableLongid){returnorderRepository.findById(id).orElseThrow(NoSuchElementException::new);}}```當(dāng)客戶端傳入非法id格式(如“abc”)時,最優(yōu)先被調(diào)用的異常處理器是:A.@ControllerAdvice中聲明的@ExceptionHandler(MethodArgumentTypeMismatchException.class)B.@ControllerAdvice中聲明的@ExceptionHandler(ConstraintViolationException.class)C.默認(rèn)的ErrorControllerD.由SpringSecurity過濾器拋出的AccessDeniedException處理器答案:A解析:SpringMVC在將URL模板變量綁定到方法參數(shù)時,若類型轉(zhuǎn)換失敗,會拋出MethodArgumentTypeMismatchException,該異常屬于Servlet層,優(yōu)先級高于業(yè)務(wù)層異常,可被@ControllerAdvice捕獲。1.3在MySQL8.0中,事務(wù)隔離級別為REPEATABLEREAD,表t(idintprimarykey,valint)初始無數(shù)據(jù)。兩個會話按時間順序執(zhí)行:```SessionA:STARTTRANSACTION;INSERTINTOtVALUES(1,10);SessionB:STARTTRANSACTION;SELECTFROMtWHEREid=1FORUPDATE;SessionA:COMMIT;```則SessionB的SELECT語句將:A.立即返回空結(jié)果B.立即返回(1,10)C.阻塞直到A提交,然后返回(1,10)D.拋出死鎖異常答案:C解析:FORUPDATE對不存在的記錄加“間隙鎖”(gaplock),SessionB會等待SessionA釋放插入意向鎖,直到A提交后才能讀取到新插入的行。1.4關(guān)于JVMG1垃圾收集器,以下哪項參數(shù)組合可以確保在Java21中開啟“分代G1”(GenerationalG1)的實驗特性?A.XX:+UseG1GCXX:+G1NewSizePercent=20B.XX:+UnlockExperimentalVMOptionsXX:+UseG1GCXX:+G1EnableGenerationalC.XX:+UseG1GCXX:+G1MixedGCCountTarget=8D.XX:+UseG1GCXX:+G1UseAdaptiveIHOP答案:B解析:分代G1在JDK21仍處于實驗階段,需顯式解鎖實驗選項并開啟G1EnableGenerational。1.5在Redis7.0中,執(zhí)行以下Lua腳本:```lualocalcnt=redis.call('INCR',KEYS[1])ifcnt==1thenredis.call('EXPIRE',KEYS[1],3600)endreturncnt```當(dāng)KEYS[1]對應(yīng)key已存在且TTL=600時,腳本執(zhí)行后TTL將變?yōu)椋篈.3600B.600C.0D.1答案:B解析:EXPIRE命令在key已設(shè)置過期時間時不會刷新TTL,除非再次顯式調(diào)用。腳本中僅在cnt==1時設(shè)置過期時間,因此原TTL保持不變。1.6在Kafka3.6中,topicA有3分區(qū),生產(chǎn)者使用默認(rèn)分區(qū)器,key為null,batch.size=16KB,linger.ms=5。當(dāng)連續(xù)發(fā)送4條1KB消息時,這些消息最可能被分配到:A.同一分區(qū)B.隨機3個分區(qū)均勻分布C.僅分區(qū)0D.僅分區(qū)1答案:A解析:key為null時,默認(rèn)分區(qū)器采用“粘性”策略,在linger.ms時間內(nèi)將消息盡量發(fā)往同一分區(qū),以減少請求數(shù)量。1.7在Java21中,以下代碼片段輸出結(jié)果:```javavarlist=List.of(1,2,3);vars=list.stream().collect(Collectors.teeing(Collectors.summingInt(Integer::intValue),Collectors.counting(),(sum,n)>sum/n));System.out.println(s);```A.2B.2.0C.6D.編譯錯誤答案:A解析:teeing收集器將下游兩個結(jié)果合并,sum=6,count=3,6/3=2,由于sum為int,count為long,除法結(jié)果為long,自動取整為2。1.8關(guān)于Maven3.9的“buildcache”特性,以下描述正確的是:A.默認(rèn)開啟,無需任何配置B.需聲明extensions.xml并啟用mavenbuildcacheextensionC.僅支持單模塊項目D.與Gradlebuildcache完全兼容答案:B解析:Maven3.9引入實驗性buildcache,需在.mvn/extensions.xml中注冊對應(yīng)擴展,并開啟配置。1.9在SpringCloud2023.0中,以下哪項配置可以強制關(guān)閉SpringCloudLoadBalancer的“服務(wù)實例緩存”?A.spring.cloud.loadbalancer.cache.enabled=falseB.spring.cloud.loadbalancer.cache.ttl=0C.spring.cloud.loadbalancer.configcache.enabled=falseD.spring.cloud.discovery.client.healthindicator.enabled=false答案:A解析:官方屬性spring.cloud.loadbalancer.cache.enabled直接控制是否啟用服務(wù)實例緩存。1.10在Docker24.0中,構(gòu)建多平臺鏡像時,以下哪條命令可以正確構(gòu)建linux/amd64與linux/arm64并推送到遠(yuǎn)程倉庫?A.dockerbuildxbuildplatformlinux/amd64,linux/arm64trepo/img:1.0push.B.dockerbuildplatformlinux/amd64,linux/arm64trepo/img:1.0push.C.dockerbuildxbuildplatformamd64,arm64trepo/img:1.0.D.dockerbuildximagetoolscreaterepo/img:1.0platformlinux/amd64,linux/arm64答案:A解析:buildx插件支持platform多值,且需顯式push才能一次性完成跨平臺構(gòu)建與推送。2.不定項選擇題(每題3分,共15分)2.1關(guān)于Java21的StructuredConcurrency(孵化器API),下列說法正確的有:A.StructuredTaskScope可確保所有子線程在作用域關(guān)閉前完成B.子線程拋出異常后,默認(rèn)情況下作用域會立即shutdown并返回PartialResultC.一個StructuredTaskScope實例可以多次調(diào)用fork()D.結(jié)構(gòu)化并發(fā)旨在減少線程泄漏與取消泄露答案:A、C、D解析:B錯誤,默認(rèn)策略為ShutdownOnSuccess或ShutdownOnFailure,需顯式選擇;A、C、D均符合設(shè)計目標(biāo)。2.2在MySQL8.0的InnoDB中,以下哪些SQL會觸發(fā)“當(dāng)前讀”(lockingread)?A.SELECTFROMtWHEREid=1B.SELECTFROMtWHEREid=1FORUPDATEC.SELECTFROMtWHEREid=1LOCKINSHAREMODED.UPDATEtSETval=val+1WHEREid=1答案:B、C、D解析:A為一致性讀(快照讀),B、C為顯式鎖定讀,D為隱式當(dāng)前讀。2.3關(guān)于Redis的RDB與AOF混合持久化,以下說法正確的有:A.開啟aofuserdbpreamble后,AOF文件首段為RDB格式B.重寫后的AOF文件只包含RDB數(shù)據(jù),不再追加命令C.混合持久化可提高重寫速度并減小AOF體積D.重啟時優(yōu)先加載AOF,即使其首段為RDB格式答案:A、C、D解析:B錯誤,重寫后先寫RDB格式,再追加增量命令;A、C、D正確。2.4在SpringFramework6.1中,以下哪些注解組合可以使得一個Bean僅在“dev”與“test”兩個profile激活時才被創(chuàng)建?A.@Profile({"dev","test"})B.@ConditionalOnExpression("'${files.active}'.contains('dev')or'${files.active}'.contains('test')")C.@ConditionalOnProperty(name="files.active",havingValue="dev",matchIfMissing=false)D.@Profile("dev|test")答案:A、B解析:C僅匹配dev;D語法錯誤;A為或關(guān)系,B通過SpEL實現(xiàn)或邏輯。2.5關(guān)于JVMJIT編譯器C2的“循環(huán)展開”(LoopUnrolling),以下哪些因素會影響其決策?A.循環(huán)體指令數(shù)B.循環(huán)迭代次數(shù)是否恒定C.是否使用XX:LoopUnrollLimitD.是否啟用XX:+UseLoopPredicate答案:A、B、C、D解析:C2綜合循環(huán)體復(fù)雜度、已知迭代次數(shù)、編譯器閾值及謂詞優(yōu)化綜合決策。3.代碼閱讀題(每題10分,共30分)3.1閱讀以下Java21代碼,寫出最終輸出結(jié)果并解釋原因。```javapublicclassQuiz{staticfinalScopedValue<String>X=ScopedValue.newInstance();publicstaticvoidmain(String[]args)throwsInterruptedException{StructuredTaskScope<String>scope=newStructuredTaskScope<>();ScopedValue.where(X,"outer").run(()>{scope.fork(()>{Thread.sleep(10);returnX.get();});});Stringresult=scope.join().result();System.out.println(result);}}```答案:拋出IllegalStateException解析:StructuredTaskScope的join()返回ScopeSnapshot,需調(diào)用result()或exception();但子任務(wù)在虛擬線程中讀取ScopedValue時,作用域已關(guān)閉,X.get()拋出IllegalStateException。正確寫法應(yīng)使用ShutdownOnSuccess策略并在作用域內(nèi)獲取結(jié)果。3.2閱讀以下MyBatis3.5映射與Spring事務(wù)代碼,指出其中可能導(dǎo)致“臟讀”的隱患并給出修復(fù)方案。```java@MapperinterfaceAccountMapper{@Select("SELECTbalanceFROMaccountWHEREid={id}")intgetBalance(intid);@Update("UPDATEaccountSETbalance=balance{amount}WHEREid={id}ANDbalance>={amount}")intdeduct(@Param("id")intid,@Param("amount")intamount);}@ServiceclassService{@AutowiredAccountMappermapper;@Transactional(isolation=Isolation.READ_COMMITTED)publicbooleantransfer(intfrom,intto,intamount){if(mapper.getBalance(from)<amount)returnfalse;mapper.deduct(from,amount);mapper.increase(to,amount);returntrue;}}```答案:在并發(fā)場景下,getBalance與deduct之間可能出現(xiàn)“余額充足”但后續(xù)被其他事務(wù)扣減的競態(tài)條件,導(dǎo)致超賣。修復(fù):使用單行UPDATE返回受影響行數(shù)判斷,合并讀改判邏輯:```java@Update("UPDATEaccountSETbalance=balance{amount}WHEREid={id}ANDbalance>={amount}")intdeduct(@Param("id")intid,@Param("amount")intamount);```在service中直接根據(jù)返回值是否為1判斷,無需前置查詢。3.3閱讀以下KafkaStreams3.6拓?fù)洌赋鲈贓xactlyOnce語義下仍可能產(chǎn)生重復(fù)輸出的場景并給出配置調(diào)整。```javaStreamsBuilderbuilder=newStreamsBuilder();builder.stream("order",Consumed.with(ProcessingMode.EXACTLY_ONCE)).groupByKey().reduce((v1,v2)>v2,Materialized.as("store")).toStream().to("summary",Produced.with(ProcessingMode.EXACTLY_ONCE));```答案:若下游消費者未開啟事務(wù)讀取,且summarytopic的cleanup.policy=compact,在應(yīng)用重啟時可能重放reduce結(jié)果并再次輸出相同key。調(diào)整:1.設(shè)置processing.guarantee=exactly_once_v2;2.下游消費者需設(shè)置isolation.level=read_committed;3.在reduce操作中加入自定義緩存窗口,避免無限期保留。4.編程題(每題15分,共30分)4.1并發(fā)限流器使用Java21虛擬線程與信號量實現(xiàn)一個QPS限流器,要求:支持動態(tài)調(diào)整permitsPerSecond使用虛擬線程執(zhí)行1000個任務(wù),每個任務(wù)耗時10ms,統(tǒng)計在1秒內(nèi)實際通過的任務(wù)數(shù)禁止busywait參考實現(xiàn):```javapublicclassRateLimiter{privatefinalSemaphoresem=newSemaphore(0);privatevolatileintpermitsPerSecond=100;publicRateLimiter(){ScheduledExecutorServicescheduler=Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(()>{inttoRelease=permitsPerSecondsem.availablePermits();if(toRelease>0)sem.release(toRelease);},0,1,TimeUnit.SECONDS);}publicvoidacquire()throwsInterruptedException{sem.acquire();}publicstaticvoidmain(String[]args)throwsException{varlimiter=newRateLimiter();varcounter=newAtomicInteger();varstart=System.currentTimeMillis();try(varscope=newStructuredTaskScope.ShutdownOnFailure()){for(inti=0;i<1000;i++){scope.fork(()>{limiter.acquire();Thread.sleep(Duration.ofMillis(10));counter.incrementAndGet();returnnull;});}scope.join();}longelapsed=System.currentTimeMillis()start;System.out.println("passed="+counter.get()+",time="+elapsed+"ms");}}```答案:輸出passed≈100,時間≈1000ms,誤差<5%。4.2SQL查詢優(yōu)化給定訂單表order(idPK,user_id,status,amount,create_time),數(shù)據(jù)量5000萬行,查詢:```sqlSELECTuser_id,SUM(amount)FROMorderWHEREstatus='PA

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論