互联网大厂Java面试实录:谢飞机的面试历险记
前言
今天给大家带来一篇别开生面的面试实录。主角是我们熟悉的"水货程序员"谢飞机,他将面对一位严肃的技术面试官,经历3轮技术拷问。文章最后会附上所有问题的详细答案解析,帮助各位求职者查漏补缺。
面试场景
地点:某互联网大厂会议室
人物:面试官(严肃脸)、谢飞机(紧张但自信)
第一轮:Java基础篇
面试官:谢飞机你好,我们开始吧。第一个问题,HashMap的底层数据结构是什么?
谢飞机:(胸有成竹)这个简单!HashMap底层是数组+链表,JDK1.8之后链表长度超过8就转成红黑树!
面试官:(微微点头)不错。那ArrayList和LinkedList有什么区别?
谢飞机:ArrayList是数组实现,查询快;LinkedList是链表实现,增删快!
面试官:(露出满意表情)回答得很好。那说说volatile关键字的作用?
谢飞机:(稍作思考)volatile保证可见性和禁止指令重排序,但不能保证原子性!
面试官:(点头)基础还可以。最后问一个,创建线程有几种方式?
谢飞机:(掰着手指数)继承Thread类、实现Runnable接口、实现Callable接口,还有...还有线程池!
面试官:(记录)嗯,第一轮表现尚可。
第二轮:框架与中间件篇
面试官:(表情严肃起来)第二轮开始。Spring的IOC和AOP分别是什么?
谢飞机:(擦汗)IOC是控制反转,把对象创建交给Spring容器;AOP是面向切面编程,用来处理日志、事务这些横切关注点...
面试官:(追问)SpringBoot的自动配置原理是什么?
谢飞机:(眼神飘忽)这个...是通过@EnableAutoConfiguration注解,然后...扫描META-INF/spring.factories文件,加载配置类...
面试官:(皱眉)Redis有哪些数据类型?
谢飞机:(来了精神)String、List、Set、ZSet、Hash!五种基本类型!
面试官:MySQL的索引类型有哪些?
谢飞机:(开始胡扯)有...B+树索引、哈希索引、还有...全文索引?大概吧...
面试官:(叹气)MyBatis的一级缓存和二级缓存了解吗?
谢飞机:(彻底懵了)一级缓存是SqlSession级别的,二级缓存是...namespace级别的?具体咋配置我忘了...
面试官:(摇头)第二轮表现一般。
第三轮:分布式与架构篇
面试官:(严肃脸)最后一轮。Dubbo的服务注册与发现是怎么实现的?
谢飞机:(额头冒汗)Dubbo...是用Zookeeper做注册中心,服务提供者注册,消费者订阅...
面试官:RabbitMQ如何保证消息不丢失?
谢飞机:(开始瞎编)这个...要配置持久化,然后...消费者确认?反正就是各种确认机制...
面试官:xxl-job的任务调度原理是什么?
谢飞机:(彻底放弃)xxl-job...是分布式任务调度平台,有调度中心和执行器...具体原理我真不知道...
面试官:DDD领域驱动设计的核心概念有哪些?
谢飞机:(一脸茫然)DDD...实体、值对象、聚合根?我就知道这几个词...
面试官:(合上简历)最后一个问题,常见的设计模式有哪些?
谢飞机:(如释重负)单例、工厂、代理、观察者、策略...这个我背过!
面试官:(站起身)好了,今天的面试就到这里。你回去等通知吧,一周内HR会联系你。
谢飞机:(起身鞠躬)好的好的,谢谢面试官!
面试题详细答案解析
第一轮答案
1. HashMap底层数据结构
HashMap在JDK1.7中是数组+链表,JDK1.8优化为数组+链表+红黑树。
核心要点:
- 当链表长度≥8且数组长度≥64时,链表转为红黑树
- 当红黑树节点≤6时,转回链表
- 默认初始容量16,负载因子0.75
- 扩容时容量变为原来的2倍
// HashMap节点结构 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; }2. ArrayList vs LinkedList
| 特性 | ArrayList | LinkedList | |------|-----------|------------| | 底层结构 | 动态数组 | 双向链表 | | 随机访问 | O(1) | O(n) | | 插入删除 | O(n) | O(1)(已知位置) | | 内存占用 | 较小 | 较大(需存储前后指针) | | 适用场景 | 查询多、增删少 | 增删多、查询少 |
3. volatile关键字作用
三大特性:
- 可见性:一个线程修改变量,其他线程立即可见
- 禁止指令重排序:通过内存屏障实现
- 不保证原子性:i++操作仍需要synchronized或AtomicInteger
// volatile使用示例 private volatile boolean flag = false; public void changeFlag() { flag = true; // 其他线程立即可见 }4. 创建线程的方式
四种方式:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(可返回结果)
- 使用线程池(推荐)
// Callable示例 ExecutorService executor = Executors.newFixedThreadPool(5); Future<Integer> future = executor.submit(() -> { return 100; });第二轮答案
1. Spring IOC和AOP
IOC(控制反转):
- 将对象创建和依赖注入交给Spring容器管理
- 通过@Component、@Autowired等注解实现
- 降低代码耦合度
AOP(面向切面编程):
- 将横切关注点(日志、事务、权限)模块化
- 通过@Aspect、@Before、@After等注解实现
- 核心概念:切面、连接点、通知、切入点
2. SpringBoot自动配置原理
核心流程:
- @SpringBootApplication包含@EnableAutoConfiguration
- 通过@Import导入AutoConfigurationImportSelector
- 扫描META-INF/spring.factories文件
- 加载所有自动配置类
- 根据@Conditional条件判断是否生效
// spring.factories示例 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.demo.DemoAutoConfiguration3. Redis数据类型
| 类型 | 说明 | 应用场景 | |------|------|----------| | String | 字符串 | 缓存、计数器 | | List | 列表 | 消息队列、最新列表 | | Set | 集合 | 去重、好友关系 | | ZSet | 有序集合 | 排行榜 | | Hash | 哈希 | 存储对象 |
4. MySQL索引类型
- B+树索引:最常用,适合范围查询
- 哈希索引:等值查询快,不支持范围查询
- 全文索引:用于文本搜索
- 空间索引:用于地理空间数据
5. MyBatis缓存机制
一级缓存:
- SqlSession级别,默认开启
- 同一SqlSession中相同查询直接返回缓存
二级缓存:
- namespace级别,需手动配置
- 多个SqlSession共享
- 需要实体类实现Serializable接口
第三轮答案
1. Dubbo服务注册与发现
工作流程:
- 服务提供者启动时向注册中心注册
- 服务消费者从注册中心订阅服务
- 注册中心返回提供者地址列表
- 消费者本地缓存地址,定期拉取更新
- 支持Zookeeper、Nacos等注册中心
2. RabbitMQ消息不丢失方案
三个环节保障:
- 生产者:开启confirm确认机制
- Broker:队列和消息持久化
- 消费者:手动ACK确认
// 生产者confirm配置 channel.confirmSelect(); channel.addConfirmListener((seq, multiple) -> { // 消息发送成功 }, (seq, multiple) -> { // 消息发送失败 });3. xxl-job调度原理
核心组件:
- 调度中心:负责任务调度管理
- 执行器:接收调度请求并执行任务
- 注册机制:执行器自动注册到调度中心
- 调度策略:支持CRON表达式、固定频率等
4. DDD核心概念
- 实体(Entity):有唯一标识的对象
- 值对象(Value Object):无唯一标识,通过属性判断相等
- 聚合根(Aggregate Root):聚合的入口,维护聚合内一致性
- 领域服务(Domain Service):不属于任何实体的业务逻辑
- 仓库(Repository):持久化抽象
5. 常见设计模式
| 类型 | 模式 | 说明 | |------|------|------| | 创建型 | 单例、工厂、建造者 | 对象创建 | | 结构型 | 代理、适配器、装饰器 | 类/对象组合 | | 行为型 | 观察者、策略、模板方法 | 对象协作 |
总结
通过这次面试实录,我们可以看到:
- 基础很重要:Java集合、多线程是必考题
- 框架要深入:Spring原理不能只会用
- 中间件要理解:Redis、MySQL要懂原理
- 分布式要掌握:微服务架构是趋势
- 持续学习:技术更新快,需要不断充电
希望各位求职者都能拿到心仪的offer!
如果觉得本文有帮助,欢迎点赞、收藏、关注!