版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年软件工程师Java后端开发面试练习题解析及答案1.单选题(每题2分,共20分)1.1在JDK17中,下列关于`var`关键字的描述正确的是A.可用于成员变量声明B.可用于方法形参列表C.可用于局部变量声明且必须立即初始化D.可用于catch子句中的异常变量声明答案:C解析:JDK10引入的`var`仅限局部变量,且必须同时初始化;编译器通过右侧表达式推断类型,不可用于成员、形参、catch。1.2关于SpringBoot3.0自动装配,以下说法正确的是A.`@EnableAutoConfiguration`已被废弃B.`spring.factories`仍被优先加载C.`METAINF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`是新的装配入口D.自动装配类必须加`@Component`答案:C解析:SpringBoot2.7起逐步迁移至`AutoConfiguration.imports`,3.0完全移除`spring.factories`对自动装配的支持。1.3在MySQL8.0中,默认的事务隔离级别是A.READUNCOMMITTEDB.READCOMMITTEDC.REPEATABLEREADD.SERIALIZABLE答案:C解析:InnoDB默认隔离级别为REPEATABLEREAD,通过MVCC+NextKeyLock解决幻读。1.4下列关于JVMG1垃圾收集器的描述,错误的是A.支持Regionbased内存布局B.可设置最大停顿时间目标C.YoungGC采用复制算法D.FullGC一定使用单线程答案:D解析:G1的FullGC在JDK10之后已改为并行多线程,仅在极端退化场景下触发。1.5在Java并发包中,`StampedLock`的`tryOptimisticRead()`失败后会A.直接抛出`IllegalMonitorStateException`B.自动升级为悲观读锁C.返回0,需用户自行决策D.触发`System.gc()`答案:C解析:乐观读返回非0戳,校验失败时返回0,需用户重新获取悲观锁。1.6使用SpringSecurity6时,下列哪种配置可关闭CSRF防护A.`http.csrf().disable()`B.`http.csrf(AbstractHttpConfigurer::disable)`C.`http.headers().frameOptions().disable()`D.`http.anonymous().disable()`答案:B解析:SpringSecurity6移除`csrf()`返回实例方法,改用LambdaDSL。1.7在Redis7.0中,可实现“流”数据持久化的命令是A.`RDBSAVE`B.`XADD`C.`XAUTOCLAIM`D.`XREADGROUP`答案:B解析:`XADD`向Stream追加消息,触发AOF追加或RDB快照,实现持久化。1.8关于虚拟线程(ProjectLoom,JDK21生产可用),正确的是A.虚拟线程由OS内核调度B.创建100万虚拟线程需100万条内核线程C.虚拟线程栈帧存储在堆外内存D.虚拟线程阻塞操作不会钉住载体线程答案:D解析:虚拟线程由JVM用户态调度器管理,阻塞时载体线程被释放,可继续运行其他虚拟线程。1.9在Kafka3.5中,__consumer_offsets主题的默认分区数是A.10B.20C.50D.100答案:C解析:Kafka0.10起默认50分区,可通过`offsets.topic.num.partitions`调整。1.10使用JPA3.1时,下列注解组合可完成逻辑删除A.`@SQLDelete(sql="UPDATEuserSETdeleted=1WHEREid=?")`B.`@Where(clause="deleted=0")`C.A+B同时使用D.`@DynamicUpdate`答案:C解析:Hibernate通过`@SQLDelete`改写DELETE语句,`@Where`过滤软删除记录,二者配合实现逻辑删除。2.多选题(每题3分,共15分)2.1以下哪些属于Java内存模型中的happensbefore规则A.程序次序规则B.管程锁定规则C.volatile变量规则D.线程中断规则E.对象终结规则答案:ABCE解析:中断规则不属于JMM正式happensbefore规则。2.2关于SpringCloud2023.x组件,正确的有A.SpringCloudGateway支持HTTP/3B.SpringCloudLoadBalancer默认使用RibbonC.SpringCloudConfig支持对称加密与非对称加密D.SpringCloudStream4.0函数式编程模型绑定器支持Kafka/RabbitMQE.SpringCloudNetflix除Eureka外全部进入维护模式答案:ACDE解析:LoadBalancer已取代Ribbon,Ribbon进入维护。2.3在Dockerfile中,可提升镜像构建缓存命中率的做法有A.将变动频率低的指令放在前面B.使用`nocache`强制刷新C.多阶段构建中把依赖下载与编译分离D.复制`pom.xml`先下载依赖再复制源码E.使用`COPY./app`一次性复制所有文件答案:ACD解析:B禁用缓存,E导致任何文件变动都失效缓存。2.4以下哪些算法可用于分布式ID生成A.UUIDv4B.SnowflakeC.LeafsegmentD.RedisINCRE.MySQLAUTO_INCREMENT答案:ABCD解析:AUTO_INCREMENT非分布式,需改造为号段模式。2.5关于Netty4.1性能调优,正确的有A.开启`Dty.allocator.type=pooled`B.设置`Dty.recycler.maxCapacityPerThread=0`禁用对象池C.使用`Epoll`替代NIO可提升Linux吞吐量D.业务Handler应执行耗时操作防止I/O线程阻塞E.写大数据包前应调用`channel.isWritable()`做流控答案:ACE解析:B禁用对象池反而降低性能;D错误,耗时操作应移交业务线程池。3.填空题(每空2分,共20分)3.1在Linux下查看Java进程JVM标志参数的命令是`jcmd<pid>VM.flags`3.2Spring事务传播行为中,若当前不存在事务就新建,存在则加入,应使用`REQUIRED`3.3MySQL8.0通过`innodb_dedicated_server=ON`可自动计算`innodb_buffer_pool_size`3.4RedisCluster槽总数是`16384`3.5在Git中,撤销已push到远程的commit,应使用`gitrevert`3.6JDK17中,启用ZGC的JVM参数为`XX:+UseZGC`3.7在Maven中,排除传递性依赖的标签是`<exclusions>`3.8使用Jackson将LocalDateTime序列化为Unix秒,需注册`JavaTimeModule`并禁用`WRITE_DATES_AS_TIMESTAMPS`3.9在Kafka中,消费者组重平衡触发条件有:①新消费者加入②消费者离开③订阅Topic分区数变化④`session.timeout.ms`超时3.10当HTTP响应码为`429`时,含义是TooManyRequests4.判断题(每题1分,共10分)4.1`synchronized`在JDK6之后默认仍为重量级锁答案:错误,JDK6引入偏向锁、轻量级锁,锁升级机制大幅降低开销。4.2在SpringMVC中,`@RequestBody`只能绑定JSON答案:错误,可绑定XML、Form、Protobuf等,取决于`HttpMessageConverter`。4.3使用MyBatis二级缓存时,默认开启答案:错误,需`<cache/>`标签或`@CacheNamespace`显式开启。4.4在JPA中,`EntityManager`的`persist`方法对游离态对象会抛`IllegalArgumentException`答案:正确。4.5RedisString底层采用SDS,长度小于1MB时扩容加倍,大于则每次加1MB答案:正确。4.6Linux`vm.swappiness=0`表示禁用交换分区答案:错误,0表示尽量不使用,而非完全禁用。4.7在Docker中,`ENTRYPOINT`与`CMD`同时出现时,CMD作为默认参数答案:正确。4.8使用Netty时,`ChannelHandlerContext.fireChannelRead()`会从头开始重新传播事件答案:错误,从当前Handler的下一个开始。4.9在JDK21中,虚拟线程的`ThreadLocal`性能低于平台线程答案:正确,虚拟线程数量巨大时,`ThreadLocal`哈希表成为瓶颈,建议用`ScopedValue`。4.10在SpringSecurity中,`PasswordEncoder`的`matches`方法线程安全答案:正确,官方实现如`BCryptPasswordEncoder`无状态且线程安全。5.简答题(每题10分,共30分)5.1描述一次完整的MySQLInnoDB聚簇索引查找二级索引回表过程,并说明如何通过覆盖索引避免回表答案:1)InnoDB主键即为聚簇索引,叶子节点存储整行数据;二级索引叶子节点存储索引列+主键值。2)SQL:`SELECTageFROMuserWHEREname='Alice'`;若name为二级索引,执行流程:a.在name索引树根节点二分查找,逐层定位到叶子节点,获得主键值`id=100`;b.使用主键100回到聚簇索引,再次走树搜索,读取整行,取出age返回,此过程称“回表”。3)覆盖索引:将查询所需列全部纳入二级索引,如建立`(name,age)`联合索引,则叶子节点已包含age,无需回表,减少一次随机I/O,提升性能。Explain中`Extra`显示`Usingindex`。5.2说明SpringBean生命周期中`BeanPostProcessor`与`InstantiationAwareBeanPostProcessor`的差异,并给出实现自定义注解`@EncryptField`完成字段敏感信息加解密的代码骨架答案:1)`BeanPostProcessor`提供`postProcessBeforeInitialization`/`postProcessAfterInitialization`,作用于Bean实例化与属性填充完成之后;`InstantiationAwareBeanPostProcessor`继承自`BeanPostProcessor`,额外提供`postProcessBeforeInstantiation`/`postProcessAfterInstantiation`,可在实例化前后干预,如创建代理对象。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`的序列化器中完成,实现透明加解密。5.3说明Redis分布式锁的Redlock算法步骤,并指出其在Java中的实现缺陷及工程级替代方案答案:1)Redlock算法步骤:a.获取当前毫秒时间T1;b.依次向N个独立Redis节点(奇数且≥3)使用相同key和随机值`uuid`执行`SETkeyuuidNXPX30000`;c.计算获取锁消耗时间`T2T1`,若小于超时时间且成功节点数≥N/2+1,则锁有效;d.锁有效期为`expire(T2T1)`;e.释放时向所有节点发送Lua脚本:`ifredis.call("get",KEYS[1])==ARGV[1]thenreturnredis.call("del",KEYS[1])elsereturn0end`。2)缺陷:网络延迟与GC导致时钟漂移,可能两个客户端同时认为持有锁;无fencingtoken,无法防止消息延迟;failover期间原主节点未同步完成,出现锁丢失。3)工程替代:使用Redis7的`BLMPOP`+`Redisson`的`RSemaphore`实现可重入锁;基于etcd或ZooKeeper的分布式锁,提供线性一致性;在业务层引入幂等token或数据库唯一索引,确保即使锁失效也不会超卖。6.编程题(15分)6.1场景:高并发秒杀,商品库存1000件,允许超卖损失≤5件。要求:使用SpringBoot3.2+RedisCluster+MySQL8.0;接口`POST/seckill/{itemId}`,返回订单号或“已售罄”;每秒并发5万请求,TP99≤200ms;提供完整Lua脚本、核心Service代码、数据库DDL,并说明如何验证不超卖。答案:1)数据库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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 20143-2026灯最大外形尺寸图的制定程序
- 2026年秋季英语专业开学第一课 专业素养与核心竞争力课件
- 2026年秋季开学幼儿园会操表演训练课件
- 2026年秋季开学高中秋分节气文化课件
- 2026新高二数学暑假专题:复习(2):平面向量及其应用
- 基于区块链的供应链可视化与韧性提升研究
- 家族办公室在耐心资本领域的投资实践研究
- 区块链技术赋能供应链透明度提升与韧性增强的机制研究
- 人工智能驱动的企业数字化转型机制与策略研究
- 基于大数据的盈利能力智能诊断模型构建
- 2026湖北黄石市阳新县事业单位统一招聘107人考试参考题库及答案详解
- 2026年新疆事业单位招聘考试《职业能力倾向测验》真题
- 2026年天津卷高考语文作文全新真题解读及五篇范文
- 2026年高考全国1卷语文高考真题含答案
- 易制爆安全教育培训制度
- 班主任经验分享勤严细实工作交流
- 2025-2026学年福建省福州市鼓楼区屏东中学九年级(上)开学数学试卷(含答案)
- 电子行业国际标准J-STD-020中文版
- 房屋市政工程有限空间作业安全管理指南
- QGDW1168-2013输变电设备状态检修试验规程
- 探伤检测合同协议
评论
0/150
提交评论