互联网大厂Java面试实录:谢飞机的面试历险记

互联网大厂Java面试实录:谢飞机的面试历险记 互联网大厂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 NodeK,V implements Map.EntryK,V { final int hash; final K key; V value; NodeK,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); FutureInteger future executor.submit(() - { return 100; });第二轮答案1. Spring IOC和AOPIOC控制反转将对象创建和依赖注入交给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如果觉得本文有帮助欢迎点赞、收藏、关注