中科创达 Java 岗多对多群面面经

中科创达(ThunderSoft) · Java 开发工程师 · 群面(多对多) · 2026-04

面试题目

面试形式

  • 形式:2 位面试官 + 2 位求职者同场,轮流答题
  • 考察方向:通用业务 + 项目经历、Java 技术体系掌握,全程深挖基础 + 项目落地

一、Java 核心基础

  1. 面向对象三大特性:继承、多态的理解
  2. 抽象类与接口的区别及使用场景
  3. 异常处理:常见异常(空指针、IO、数组越界)、try-catch-finally 用法
  4. 集合:Set 的特点与去重场景,底层实现逻辑(含红黑树相关)
  5. JDK 基础概念及实现组件方式、IOC 核心理解
  6. 重写(Override)与重载(Overload)的区别

二、并发编程(场景题)

场景描述:设计一个仓库系统,支持收发货物,说明如何解决大量货物出库并发问题。

  1. 高并发场景下如何保证数据一致性
  2. 消息队列在高并发中的作用(削峰、异步解耦)
  3. 锁的作用与使用场景
  4. 死锁产生的条件及解决方法
  5. 事务在高并发购票场景中的应用

三、数据库

  1. 多表设计(用户表 / 乐队表 / 演唱会表 / 账户表)
  2. 表间关联关系如何保证(外键、约束等)

四、项目落地

  1. 团队任务分配与协作模式
  2. 项目难点及解决方案

五、通用问题

  1. AI 工具在刷题、论文阅读 / 复现中的使用
  2. 个人优势
  3. 保研 / 考研情况及职业规划

参考解析

抽象类与接口的区别

  • 抽象类可以有构造方法、成员变量、普通方法;接口(JDK 8 前)只能有抽象方法和常量。
  • 一个类只能继承一个抽象类,但可以实现多个接口。
  • 抽象类适合”is-a”关系(如 Animal → Dog);接口适合”can-do”能力描述(如 Flyable、Serializable)。
  • JDK 8 后接口支持 defaultstatic 方法,但仍无状态字段。

重写(Override)与重载(Overload)

  • 重载:同一类中方法名相同、参数列表不同,与返回值无关,编译期确定(静态分派)。
  • 重写:子类覆盖父类方法,方法签名完全一致,运行期确定(动态分派,多态核心)。
  • 重写要求访问权限不能更严格,不能抛出更宽泛的受检异常。

Set 底层实现与去重原理

  • HashSet 底层是 HashMap,元素作为 key 存储;去重依赖 hashCode() + equals()
  • TreeSet 底层是红黑树(TreeMap),元素有序,去重依赖 compareTo()Comparator
  • 使用自定义对象存入 Set 时,必须同时重写 hashCodeequals,否则去重失效。

高并发仓库出库场景设计

  • 乐观锁:库存字段加版本号(version),更新时 WHERE version = old_version,CAS 思想,适合冲突少的场景。
  • 悲观锁SELECT ... FOR UPDATE 行锁,适合冲突频繁场景,但吞吐量低。
  • 消息队列削峰:出库请求先入 MQ(如 RocketMQ/Kafka),消费者按序处理,避免瞬时流量击穿数据库。
  • 分布式锁:多实例部署时用 Redis SETNX 或 Redisson 保证同一时刻只有一个节点操作库存。

死锁产生条件与解决

  • 四个必要条件:互斥、占有并等待、不可剥夺、循环等待。
  • 预防:固定加锁顺序(破坏循环等待);尝试加锁超时(tryLock);一次性申请所有资源。
  • 检测与恢复:JVM 可用 jstack 检测死锁;数据库有死锁检测机制会自动回滚代价小的事务。

事务在高并发购票中的应用

  • 使用数据库事务保证”查询库存 → 扣减库存 → 生成订单”原子性,防止超卖。
  • 隔离级别选 可重复读(RR) 或配合行锁;避免幻读可用间隙锁或应用层分布式锁。
  • 超卖根本解法:将库存扣减改为 UPDATE stock SET num = num - 1 WHERE id = ? AND num > 0,利用数据库原子更新 + 影响行数判断是否成功。

多表关联关系保证

  • 逻辑外键:应用层维护关联,查询时 JOIN,不在数据库层加外键约束(互联网常见做法,避免级联删除风险)。
  • 物理外键:FOREIGN KEY 约束,数据库层强制一致性,适合数据一致性要求极高的场景。
  • 多对多关系(如用户-演唱会)需引入中间关联表,存储两侧主键及附加属性(如购票时间、座位号)。