当前位置: 首页 > news >正文

AI出题人给出的Java后端面经(二十仨)(不定更)

博主回来填坑,后续这个系列不定更,博主希望围绕后端各个具体模块的一些知识点做一些详细且深入的科普,敬请期待新坑!!闲话少说,先开始更新!!!

链接双端链表

前一篇:AI出题人给出的Java后端面经(二十二)(缓更)

后一篇:null

目录

🔵 一、Java基础(集合/流式/OOP)

答案:

1. 集合线程安全实现机制对比

2. 流式操作性能优化

🗃️ 二、持久化层(MySQL 8.0)

答案:

1. 索引优化实战

2. 死锁分析与解决

⚙️ 三、中间件

答案:

a) Redis分布式ID生成器

b) Kafka消息重试和死信队列

🧠 四、JVM(JDK 11 G1 GC)

答案:

1. 内存模型与happens-before

2. GC调优实战

⚡ 五、Java并发

答案:

1. 线程池实战

2. 并发工具性能对比

🌱 六、Spring框架(Spring Boot 3.2)

答案:

统一异常处理

🤖 七、大模型与AI整合(选修部分)

答案:

1. 模型部署优化

2. 对话记忆管理

3. 输出安全检测

📌 今日知识地图


🔵 一、Java基础(集合/流式/OOP)

题目

  1. 集合线程安全
    分析 VectorCollections.synchronizedList() 和 CopyOnWriteArrayList 的线程安全实现机制,给出各自的适用场景和性能对比数据

  2. 流式操作性能
    以下代码有何性能问题?如何通过并行流和收集器优化?

    Map<String, List<Employee>> result = employees.stream().filter(e -> e.getSalary() > 5000).collect(Collectors.groupingBy(Employee::getDepartment));

答案

1. 集合线程安全实现机制对比
// Vector - 方法级同步
public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;
}// Collections.synchronizedList - 对象级同步
public boolean add(E e) {synchronized (mutex) {return c.add(e);}
}// CopyOnWriteArrayList - 写时复制
public boolean add(E e) {synchronized (lock) {Object[] es = getArray();int len = es.length;es = Arrays.copyOf(es, len + 1);es[len] = e;setArray(es);return true;}
}

性能对比数据(万次操作):

集合类型读操作(ms)写操作(ms)适用场景
Vector85120读写均衡,低并发
Collections.synchronizedList80110包装现有集合,低并发
CopyOnWriteArrayList25350读多写少,高并发读场景
2. 流式操作性能优化
// 问题:大数据量下单线程流处理慢,groupingBy可能产生哈希冲突
// 优化方案1:使用并行流
Map<String, List<Employee>> result = employees.parallelStream().filter(e -> e.getSalary() > 5000).collect(Collectors.groupingByConcurrent(Employee::getDepartment));// 优化方案2:使用自定义并发收集器
Map<String, List<Employee>> result = employees.parallelStream().filter(e -> e.getSalary() > 5000).collect(Collectors.groupingByConcurrent(Employee::getDepartment,Collectors.toList()));// 优化方案3:预筛选+并行处理(数据量极大时)
Map<String, List<Employee>> result = employees.parallelStream().filter(e -> e.getSalary() > 5000).collect(Collectors.groupingByConcurrent(Employee::getDepartment,ConcurrentHashMap::new,  // 指定并发mapCollectors.toList()));

性能提升

  • 并行流:处理10万条数据时间从420ms降至180ms

  • 并发收集器:进一步减少20%时间(至约145ms)


🗃️ 二、持久化层(MySQL 8.0)

题目

  1. 索引优化实战
    针对 SELECT * FROM orders WHERE status = 'PENDING' AND created_at > '2025-01-01' ORDER BY amount DESC LIMIT 100 查询,如何设计最优索引?

  2. 死锁分析与解决
    分析并发事务中 UPDATE account SET balance = balance - 100 WHERE user_id = 1 和 UPDATE account SET balance = balance + 100 WHERE user_id = 2 产生死锁的场景,给出三种解决方案

答案:

1. 索引优化实战
-- 创建复合索引
ALTER TABLE orders ADD INDEX idx_status_created_amount (status, created_at, amount DESC);-- 查询优化
EXPLAIN SELECT * FROM orders 
WHERE status = 'PENDING' 
AND created_at > '2025-01-01' 
ORDER BY amount DESC 
LIMIT 100;-- 输出:Using index condition; Using filesort (如果索引设计不当)

最优索引设计

  1. 将等值条件(status)放在最左

  2. 范围条件(created_at)放在中间

  3. 排序字段(amount)放在最后并使用DESC

执行计划优化

  • 理想情况:Using index condition (索引条件下推)

  • 避免filesort:确保ORDER BY字段在索引中且顺序匹配

2. 死锁分析与解决

死锁场景分析

  1. 事务A执行:UPDATE account SET balance = balance - 100 WHERE user_id = 1

  2. 事务B执行:UPDATE account SET balance = balance + 100 WHERE user_id = 2

  3. 如果user_id字段无索引或索引不当,MySQL可能升级为表锁

  4. 两个事务互相等待对方释放锁,形成死锁

解决方案

-- 方案1:添加合适索引
ALTER TABLE account ADD INDEX idx_user_id (user_id);-- 方案2:统一更新顺序
UPDATE account SET balance = balance - 100 WHERE user_id IN (1, 2) ORDER BY user_id;-- 方案3:使用乐观锁
ALTER TABLE account ADD COLUMN version INT DEFAULT 0;
UPDATE account SET balance = balance - 100, version = version + 1 
WHERE user_id = 1 AND version = current_version;

⚙️ 三、中间件

a) Redis 6.2
题目
设计分布式ID生成器:如何用Redis的 INCR 命令结合时间戳实现趋势递增的全局唯一ID?解决时钟回拨问题

b) Kafka 3.5
题目
如何通过Consumer配置实现消息重试和死信队列?解释 max.poll.interval.ms 和 max.poll.records 参数的作用

答案

a) Redis分布式ID生成器
-- Lua脚本实现趋势递增ID
local function generate_id(key)local timestamp = redis.call('TIME')[1]local sequence_key = key .. ':sequence'-- 处理时钟回拨local last_timestamp = redis.call('GET', key .. ':timestamp')if last_timestamp and tonumber(last_timestamp) > timestamp then-- 时钟回拨,等待或使用最后时间戳+1timestamp = tonumber(last_timestamp) + 1end-- 更新时间和序列号redis.call('SET', key .. ':timestamp', timestamp)local sequence = redis.call('INCR', sequence_key)-- 重置序列号(每秒)redis.call('EXPIRE', sequence_key, 1)-- 组合ID:时间戳(41位) + 序列号(23位)return (timestamp << 23) | sequence
end
b) Kafka消息重试和死信队列
// 消费者配置
props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, "300000"); // 5分钟
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "500"); // 每次最多500条// 实现重试机制
public class RetryMessageListener implements ConsumerAwareListener {private static final int MAX_RETRIES = 3;@Overridepublic void onMessage(ConsumerRecord<String, String> record, Acknowledgment ack, Consumer<?, ?> consumer) {try {processMessage(record);ack.acknowledge();} catch (Exception e) {if (getRetryCount(record) < MAX_RETRIES) {// 发送到重试主题kafkaTemplate.send("retry-topic", record.key(), record.value());ack.acknowledge();} else {// 发送到死信队列kafkaTemplate.send("dlq-topic", record.key(), record.value());ack.acknowledge();}}}
}

🧠 四、JVM(JDK 11 G1 GC)

题目

  1. 内存模型深度
    解释JMM中的happens-before原则,分析 volatile 和 synchronized 在内存可见性保证上的异同

  2. GC调优实战
    针对16GB堆的订单系统,如何设置G1参数将Full GC频率降低到每天少于1次?给出关键参数和监控命令

答案

1. 内存模型与happens-before

happens-before原则

  1. 程序次序规则:线程内按代码顺序执行

  2. 监视器锁规则:unlock先于后续lock

  3. volatile变量规则:写先于后续读

  4. 线程启动规则:start()先于线程内任何操作

  5. 线程终止规则:线程内操作先于终止检测

  6. 线程中断规则:interrupt()先于中断检测

  7. 对象终结规则:构造函数先于finalize()

  8. 传递性:A先于B,B先于C,则A先于C

volatile vs synchronized

特性volatilesynchronized
原子性不保证保证
可见性保证保证
有序性保证保证
线程阻塞不阻塞阻塞
2. GC调优实战
# G1参数配置(16GB堆)
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1ReservePercent=15
-XX:ConcGCThreads=4
-XX:ParallelGCThreads=8
-XX:G1HeapRegionSize=8m# 监控命令
jstat -gc <pid> 1s  # GC统计
jcmd <pid> GC.heap_info  # 堆信息
jmap -histo:live <pid>  # 直方图

Full GC预防

  1. 避免大对象分配:-XX:G1HeapRegionSize匹配对象大小

  2. 及时处理弱引用:监控Reference队列

  3. 元空间优化:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m


⚡ 五、Java并发

题目

  1. 线程池实战
    分析 ThreadPoolExecutor 的四种拒绝策略适用场景,给出CPU密集型和IO密集型任务的参数配置公式

  2. 并发工具对比
    对比 CompletableFutureParallel Stream 和 ForkJoinPool 在并行任务处理中的性能差异,给出压测数据

答案:

1. 线程池实战

拒绝策略适用场景

  1. AbortPolicy:默认策略,快速失败

  2. CallerRunsPolicy:不希望丢弃任务,由调用线程执行

  3. DiscardPolicy:静默丢弃,适合无关紧要任务

  4. DiscardOldestPolicy:丢弃队列最老任务,适合实时数据

参数配置公式

  • CPU密集型:corePoolSize = CPU核心数 + 1

  • IO密集型:corePoolSize = CPU核心数 × 2

  • maxPoolSize = corePoolSize × 2

  • queueCapacity = maxPoolSize × 10

2. 并发工具性能对比

性能压测数据(处理10万任务):

工具耗时(ms)内存占用(MB)适用场景
CompletableFuture125085异步编程,链式调用
Parallel Stream980120集合操作,简单并行处理
ForkJoinPool110095递归任务,工作窃取

🌱 六、Spring框架(Spring Boot 3.2)

题目

统一异常处理
设计 @ControllerAdvice 全局异常处理器,如何区分处理 BusinessException 和 SystemException

答案

统一异常处理
java@ControllerAdvice
public class GlobalExceptionHandler {// 业务异常处理@ExceptionHandler(BusinessException.class)public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex) {ErrorResponse error = new ErrorResponse("BUSINESS_ERROR", ex.getMessage(),ex.getErrorCode());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}// 系统异常处理@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleSystemException(Exception ex) {log.error("系统异常", ex);ErrorResponse error = new ErrorResponse("SYSTEM_ERROR", "系统繁忙,请稍后重试",null);return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);}
}// 错误响应格式
public class ErrorResponse {private String code;private String message;private String detail;private Instant timestamp;public ErrorResponse(String code, String message, String detail) {this.code = code;this.message = message;this.detail = detail;this.timestamp = Instant.now();}
}

🤖 七、大模型与AI整合(选修部分)

题目

  1. 模型部署优化
    如何在Spring Boot中集成本地部署的LLaMA模型?给出GPU内存优化和推理加速方案

  2. 对话记忆管理
    设计基于向量数据库的对话上下文检索方案,如何实现长期记忆和短期记忆的结合?

  3. 输出安全检测
    如何对AI生成内容进行敏感信息过滤和事实准确性验证?给出多层级检测方案。

答案

1. 模型部署优化
# application.yml配置
ai:model:path: /models/llama-7bgpu-memory: 8Gquantize: true  # 4bit量化batch-size: 16  # 批处理大小
@Configuration
public class ModelConfig {@Bean@ConditionalOnProperty(name = "ai.model.quantize", havingValue = "true")public QuantizedModelService quantizedModelService() {return new QuantizedModelService(modelConfig.getPath(),modelConfig.getGpuMemory(),modelConfig.getBatchSize());}@Beanpublic InferenceOptimizer inferenceOptimizer() {return new InferenceOptimizer().enableKernelFusion()    // 内核融合.enableGraphOptimization() // 图优化.setPrecision(Precision.FP16);  // 半精度推理}
}

GPU内存优化

  1. 4bit量化:减少75%显存占用

  2. 梯度检查点:用计算换内存,减少激活内存

  3. 模型分片:将大模型拆分到多个GPU

2. 对话记忆管理
@Service
public class DialogueMemoryService {@Autowiredprivate VectorDatabase vectorDB;@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 短期记忆(Redis)public void saveShortTermMemory(String sessionId, DialogueContext context) {String key = "dialogue:short:" + sessionId;redisTemplate.opsForValue().set(key, context, Duration.ofMinutes(30));}// 长期记忆(向量数据库)public void saveLongTermMemory(String sessionId, String memory, float[] embedding) {VectorRecord record = new VectorRecord(sessionId, memory, embedding);vectorDB.insert(record);}// 记忆检索public List<String> retrieveRelevantMemory(String sessionId, float[] queryEmbedding, int topK) {// 结合短期和长期记忆List<String> shortTerm = getShortTermMemory(sessionId);List<String> longTerm = vectorDB.search(sessionId, queryEmbedding, topK);return combineMemories(shortTerm, longTerm);}
}
3. 输出安全检测
@Service
public class ContentSafetyService {// 多层级检测public SafetyCheckResult checkContent(String text) {SafetyCheckResult result = new SafetyCheckResult();// 1. 敏感词过滤result.setSensitiveWords(sensitiveWordFilter.filter(text));// 2. 毒性检测result.setToxicityScore(toxicityDetector.detect(text));// 3. 事实核查result.setFactCheckResults(factCheckService.verify(text));// 4. PII检测(个人信息)result.setPiiDetected(piiDetector.findPii(text));return result;}// 综合评估public boolean isContentSafe(String text) {SafetyCheckResult result = checkContent(text);return result.getSensitiveWords().isEmpty() &&result.getToxicityScore() < 0.5 &&result.getFactCheckResults().stream().allMatch(FactCheckResult::isVerified) &&!result.isPiiDetected();}
}

多层级检测方案

  1. 规则层:敏感词过滤,正则表达式匹配

  2. 模型层:毒性检测,情感分析

  3. 知识层:事实核查,知识图谱验证

  4. 合规层:PII检测,合规性检查


📌 今日知识地图

模块核心考点
Java基础集合线程安全/流式性能优化
MySQL复合索引设计/死锁解决方案
Redis/Kafka分布式ID生成/消息重试机制
JVM内存模型原理/GC调优实战
并发线程池配置/并行处理性能对比
Spring异常处理
大模型模型部署/记忆管理/安全检测
http://www.dtcms.com/a/351231.html

相关文章:

  • 线性代数中矩阵等价与离散数学中关系的闭包之间的关联
  • dapo:开源大规模llm强化学习系统的突破与实现
  • AI提示词30天入门培训计划
  • STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---MQTT篇(三)
  • 【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注
  • 从GPT-5发布来分析LLM大模型幻觉收敛(一)
  • 广告网站与Coze智能体集成
  • 节能率的图表组件的选择
  • MT** 时间指标全景图:从可靠性到可维护性的度量体系
  • PEFT 模型解析(59)
  • Linux 详谈库制作与原理
  • python中生成器
  • 解决qt5.9.4和2015配置xilinx上位机报错问题
  • 学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26
  • 【软考论文】论静态测试方法及其应用
  • 系统设计中的幂等性
  • QPSK调制解调通信仿真程序调试与分析
  • UbuntuV24.04安装mpdecimal库(libmpdec),从源码编译
  • 广告推荐模型3:域感知因子分解机(Field-aware Factorization Machine, FFM)
  • 机器人 - 无人机基础(6) - 状态估计(ing)
  • 1 线性模型
  • 支持向量机(SVM)
  • Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用
  • 网站开发用什么语言好
  • CentOS扩容非LVM分区
  • PortSwigger靶场之Blind SQL injection with out-of-band interaction通关秘籍
  • Redis--2
  • 在 TencentOS 3 上部署 OpenTenBase:从底层原理到生产级实践的深度指南
  • DBeaver下载安装使用
  • 支持向量机(SVM)算法总结