亚信科技 Java 开发一面:面向对象、数据库索引与线上问题排查
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍和项目介绍。
- 说一下面向对象三大特性封装、继承、多态分别是什么?
- 数据库中主键的作用。
- 数据库中索引的作用。
- 索引建立的越多越好吗?
- 使用索引会遇到哪些问题?
- 如果代码在运行过程中报错了,该怎么排查?
- 如果项目在运行过程中卡死了怎么排查?
- 项目中遇到的问题以及怎么解决的?
- 性格提问。
- 最近一天的时间是怎么安排的?
《参考解析》
面向对象三大特性:封装是把数据和操作数据的方法包在类里,只暴露必要接口,隐藏实现细节,好处是降低耦合并能在入口处做校验;继承是子类复用父类的属性和行为,可以扩展或重写,代价是继承层次过深会让代码难以理解和修改,所以一般优先组合;多态是同一个父类引用在运行时指向不同子类对象、调用同一个方法表现出不同行为,Java 靠父类引用加方法重写实现,底层是虚方法表在运行时动态绑定。答题时把「是什么 + 带来什么 + 有什么代价」讲全,比背定义更容易得分。
主键与索引:主键唯一标识一行记录,非空且唯一,天然带唯一索引,InnoDB 中主键还是聚簇索引的键——数据行就按主键顺序组织在 B+ 树叶子节点上。因此主键最好用短小、单调递增的类型(如自增 bigint),避免用长字符串或随机 UUID,否则页分裂和二级索引体积都会变大。索引的作用是减少扫描行数:把列值按 B+ 树组织,等值查询、范围查询、排序和 join 的驱动表都能借它把全表扫描变成索引查找,同时唯一索引还能承担业务唯一性约束。
索引不是越多越好:索引本身占磁盘和缓冲池,每次 insert、update、delete 都要同步维护所有相关索引,写放大明显;优化器在候选索引变多时也可能选错执行计划。所以应按真实查询建索引,优先给高频过滤、排序、join 的列建,能用联合索引覆盖多个条件就不要再拆成多个单列索引,并及时用慢查询日志和 EXPLAIN 清理长期用不到的索引。
使用索引常见问题:一是索引失效,比如在索引列上做函数运算或隐式类型转换、like '%xx' 前置通配、or 连接了无索引列、违反最左前缀原则;二是回表次数多,走二级索引拿到主键还要再查聚簇索引,可以用覆盖索引避免;三是区分度低的列(性别、状态)单独建索引收益很小;四是范围查询之后联合索引的后续列无法继续用于定位;五是数据量小或查询命中大部分行时,优化器宁可全表扫描。回答时最好各配一句「怎么发现、怎么改」。
代码报错怎么排查:先看异常栈的最外层业务信息和 Caused by 根因,定位到具体类、行号和线程;再结合日志上下文确认入参、时间点和是否可复现,必要时本地断点或加临时日志复现。区分是业务校验失败、空指针/类型转换这类编码问题,还是连接池耗尽、超时、下游返回异常这类外部依赖问题。修复后要补上防御性校验和监控告警,而不是只把这一处异常 catch 掉。
项目卡死怎么排查:卡死通常是线程阻塞或资源耗尽。先用 jps 找到进程,top -Hp <pid> 看哪个线程吃满 CPU,再把线程号转十六进制到 jstack <pid> 里对照;也可以间隔十几秒连打两三次 jstack,对比哪些线程一直停在同一个栈上——停在 BLOCKED 说明有锁竞争,停在 socket read 或数据库连接获取上说明下游或连接池有问题。配合 jstat -gcutil 看是否频繁 Full GC,jmap 或堆 dump 确认是否内存泄漏,再查数据库是否有长事务、慢 SQL 或行锁等待。
项目难点与软性问题:项目问题按「背景—我的职责—难点—方案对比—结果数据」讲一个具体案例,重点说清为什么选这个方案、踩了什么坑。性格和时间安排类问题不用刻意包装,用一件真实的事说明自己的做事方式即可,回答保持和简历、项目描述一致。最后的反问环节可以问团队技术栈、新人培养节奏或业务方向,避免一上来问薪资和加班。