中科创达 Java 岗多对多群面面经
面试题目
面试形式
- 形式:2 位面试官 + 2 位求职者同场,轮流答题
- 考察方向:通用业务 + 项目经历、Java 技术体系掌握,全程深挖基础 + 项目落地
一、Java 核心基础
- 面向对象三大特性:继承、多态的理解
- 抽象类与接口的区别及使用场景
- 异常处理:常见异常(空指针、IO、数组越界)、
try-catch-finally用法 - 集合:Set 的特点与去重场景,底层实现逻辑(含红黑树相关)
- JDK 基础概念及实现组件方式、IOC 核心理解
- 重写(Override)与重载(Overload)的区别
二、并发编程(场景题)
场景描述:设计一个仓库系统,支持收发货物,说明如何解决大量货物出库并发问题。
- 高并发场景下如何保证数据一致性
- 消息队列在高并发中的作用(削峰、异步解耦)
- 锁的作用与使用场景
- 死锁产生的条件及解决方法
- 事务在高并发购票场景中的应用
三、数据库
- 多表设计(用户表 / 乐队表 / 演唱会表 / 账户表)
- 表间关联关系如何保证(外键、约束等)
四、项目落地
- 团队任务分配与协作模式
- 项目难点及解决方案
五、通用问题
- AI 工具在刷题、论文阅读 / 复现中的使用
- 个人优势
- 保研 / 考研情况及职业规划
参考解析
抽象类与接口的区别
- 抽象类可以有构造方法、成员变量、普通方法;接口(JDK 8 前)只能有抽象方法和常量。
- 一个类只能继承一个抽象类,但可以实现多个接口。
- 抽象类适合”is-a”关系(如 Animal → Dog);接口适合”can-do”能力描述(如 Flyable、Serializable)。
- JDK 8 后接口支持
default和static方法,但仍无状态字段。
重写(Override)与重载(Overload)
- 重载:同一类中方法名相同、参数列表不同,与返回值无关,编译期确定(静态分派)。
- 重写:子类覆盖父类方法,方法签名完全一致,运行期确定(动态分派,多态核心)。
- 重写要求访问权限不能更严格,不能抛出更宽泛的受检异常。
Set 底层实现与去重原理
HashSet底层是HashMap,元素作为 key 存储;去重依赖hashCode()+equals()。TreeSet底层是红黑树(TreeMap),元素有序,去重依赖compareTo()或Comparator。- 使用自定义对象存入 Set 时,必须同时重写
hashCode和equals,否则去重失效。
高并发仓库出库场景设计
- 乐观锁:库存字段加版本号(
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约束,数据库层强制一致性,适合数据一致性要求极高的场景。 - 多对多关系(如用户-演唱会)需引入中间关联表,存储两侧主键及附加属性(如购票时间、座位号)。