个人情况:社招一年半
面试公司:上海海鼎信息和深圳小赢科技
面试感受:总体难度还是有点大的,第二家公司拷打的问题非常非常多,一共 60 个问题,多少有点离谱儿。不过,面试体验很好,面试官会引导往哪个方向思考。
一面
- 请做一下自我介绍。
- 请介绍一下你参与过的项目。
- 请解释一下接口(Interface)和抽象类(Abstract Class)的区别。
- 什么是受检异常(Checked Exception)和非受检异常(Unchecked Exception)?
- 请比较 String、StringBuffer 和 StringBuilder 的区别。
- 请列举 Object 类中的常用方法。
- HashTable 和 ConcurrentHashMap 是如何保证线程安全的?它们的原理是什么?
- 死锁产生的原因是什么?如何避免死锁?
- 请谈谈 Java 中的锁机制(例如 synchronized, ReentrantLock 等)。
- 请解释一下数据库的行级锁。
- 什么是线程?请介绍一下 Java 中的多线程。
- 介绍一下 Java 的线程池,包括核心参数和常见的拒绝策略。
- 请描述 JVM 的内存区域划分(哪些是线程私有,哪些是共享)?JDK 1.7 和 1.8 在这方面有什么主要区别(比如方法区/元空间)?
- 请描述一次典型的垃圾回收(GC)流程。
- 你了解哪些 JVM 的核心配置参数?什么是 OOM (OutOfMemoryError)?
- 什么是数据库事务?什么是分布式事务?你在工作中有实际使用过分布式事务吗?
- 你通常如何进行 SQL 调优?
- 进行接口对接时,你会遵循哪些设计原则?
- 如果一个接口访问很慢,你会如何排查问题?
- 请解释一下 Spring Boot 的自动装配原理。
- 如何设计方案来保证库存在高并发下不会超卖(超扣)?如何处理并发的出库和入库?
- 如果线上系统发生卡顿甚至导致服务重启,你会如何分析原因?
参考答案 :上面绝大部分面试问题的答案,都可以在 JavaGuide 和 《Java 面试指北》 中找到。
一面 (另一场)
- 请做一下自我介绍。
- Redisson 实现分布式锁的原理是什么?它是如何支持可重入的?
- 使用 Redisson 分布式锁时,未能获取锁的线程会阻塞,它们是如何被唤醒的?
- (针对上题)使用定时任务轮询来尝试唤醒这些阻塞的线程,这种方式可行吗?为什么?
- 动态多数据源切换是如何实现的?其基本原理是什么?
- 请谈谈 ThreadLocal 的特性和作用。
- ThreadLocal 可能导致内存泄漏吗?为什么?如何避免?
- 请解释一下模板方法设计模式及其主要使用场景。
- 在 Java 中,你最常使用哪些集合类?
- ArrayList 是线程安全的吗?有哪些线程安全的 List 实现?
- CopyOnWriteArrayList 是通过加锁实现的吗?它的原理是什么?除了它还有其他的线程安全 List 吗(如 Vector, Collections.synchronizedList)?
- 请描述 HashMap 的底层数据结构(JDK 1.7 和 1.8+)。
- 数组和链表的主要区别、各自特点以及适用场景是什么?
- 如果 HashMap 中发生了大量的哈希冲突,可能的原因有哪些?
- HashMap 是线程安全的吗?请举例说明它在多线程环境下可能出现的问题(如 JDK 1.7 的死循环,JDK 1.8 的数据覆盖)。
- 如果需要线程安全的 Map,有哪些选择(如 ConcurrentHashMap, Hashtable, Collections.synchronizedMap)?
- ConcurrentHashMap 是如何保证线程安全的(分段锁/CAS + Synchronized)?
- 请解释一下 CAS(Compare-and-Swap)操作的原理。
- CAS 操作中的 ABA 问题是什么?如何解决(例如使用版本号)?
- 线程池主要用于哪些场景?为什么要使用线程池?它的优点是什么?
- 线程池中的阻塞队列(BlockingQueue)起什么作用?有哪些常用的阻塞队列类型?
- 请比较 synchronized 和 ReentrantLock 的主要区别。
- 请解释面向对象编程(OOP)和面向过程编程(POP)的区别。
- 你了解函数式编程吗?它有哪些主要特性?这些特性与并发编程和线程安全有什么关系(例如不可变性)?
- 如何排查 OOM (OutOfMemoryError) 问题?
- 除了堆内存 OOM,栈内存会发生 OOM(更准确地说是 StackOverflowError)吗?什么样的代码可能导致栈溢出?
- 请描述 Spring 中 Bean 的完整生命周期。
- 你了解 Spring 的事务管理吗?哪些场景下 Spring 事务会失效?如果想让同一个类中方法内部调用也应用事务,该如何处理?
- 如果让你封装一个日志组件,用于自动打印接口的请求参数、响应结果和执行时间,你会如何设计?
- 如果需要在系统中加入限流和熔断功能,你会考虑使用哪些技术(如 Sentinel, Resilience4j)?请具体描述一下实现思路。
- 你是如何理解"面向接口编程"的?它有什么好处?
- MySQL 索引(例如 B+ 树索引)的底层实现原理是什么?
- B 树和 B+ 树的主要区别是什么?为什么 MySQL 选择 B+ 树?
- 如果需要为 a 和 b 两个字段创建联合索引,应该创建
(a, b)
还是(b, a)
?依据是什么? - 请列举一些常见的导致 MySQL 索引失效的场景。
- 为什么包含大量 NULL 值的列上建立索引效果可能不好或"失效"?(注意:MySQL 对 NULL 值索引已有优化,具体取决于版本和场景)
SELECT *
和SELECT <索引字段>
在使用索引方面有什么区别(例如覆盖索引)?- 如何为一个很长的字符串字段(如 URL)在大数据量表中创建高效的索引(例如前缀索引)?
- (针对上题)除了使用前缀索引,还有没有其他需要增加字段的方式来优化长字符串索引(例如使用 HASH 索引或将 URL 特征提取到新字段)?
- 为什么通常推荐使用自增 ID 作为 MySQL 表的主键?
- 请介绍一下数据库事务的隔离级别。
- MySQL 是如何实现"读已提交"(Read Committed)和"可重复读"(Repeatable Read)隔离级别的(例如通过 MVCC)?
- 请简要解释一下 MVCC(多版本并发控制)的原理。
- 除了索引优化,还有哪些常见的 SQL 慢查询优化方法?
- Redis 为什么采用单线程模型?它单线程为什么还能这么快?
- 什么是缓存雪崩?如何解决?
- 什么是缓存穿透?如何解决?
- 请介绍一下布隆过滤器(Bloom Filter)的原理和应用场景。
- 如果需要统计网站搜索某关键词的用户数量(UV),且允许一定误差,你会使用什么技术(例如 HyperLogLog)?
- HyperLogLog 的底层原理大致是怎样的?它的内存占用情况如何?
- 设计一个支付接口时,如何保证其幂等性?
- 在高并发场景下,如何在不使用分布式锁的情况下保证支付接口的幂等性(例如使用唯一请求 ID + 状态机/去重表)?
- 请描述一下使用乐观锁(例如基于版本号)的基本流程。
- 请再次介绍一下你的项目及其系统架构。
- 如果将一个单体应用改造为微服务架构,主要需要考虑哪些方面?服务间的调用通常如何实现?描述一下前端请求到达后端微服务的典型流程。
- Nginx 常用的负载均衡策略有哪些?如果后端某个服务节点故障,Nginx 是如何感知并处理的(健康检查)?
- 如果让你为一个系统设计监控体系,你会关注哪些关键指标?监控系统通常如何采集这些数据?
- 在工作之外,你学习或了解到的比较有挑战性的技术问题是什么?
- (如果适用)你认为从传统企业背景如何快速适应互联网公司的工作节奏和文化?
- 你对当前人工智能(AI)的发展有什么看法?它对软件开发可能带来哪些影响?
二面
- 如果让你指导一位新人排查线上接口响应慢的问题,你会建议他从哪些方面入手?如何分析和进行 SQL 调优?
- 为什么选择使用 Spring Boot?假设一个公司官网使用 Spring Boot,你认为主要原因可能是什么?相比 PHP、Python 等技术栈,它有哪些优势或考量?
- ...
参考答案 :上面绝大部分面试问题的答案,都可以在 JavaGuide 和 《Java 面试指北》 中找到。