互联网大厂Java面试:谢飞机的“精彩”表现
互联网大厂Java面试:谢飞机的“精彩”表现
场景:互联网大厂面试间
第一轮:基础知识
面试官:谢飞机,我们先从Java基础开始,简单聊聊:
- 请解释一下HashMap的工作原理。
- ArrayList和LinkedList的区别是什么?
- 说一下JVM的内存模型。
谢飞机:好的!
- HashMap就是用来存键值对的嘛,键找值可快了,像个电话簿一样。
- ArrayList和LinkedList的区别……ArrayList快,LinkedList慢吧?
- JVM内存模型?……这个……是不是Java运行的地方?
面试官:(微微皱眉)好吧,继续下一轮。
第二轮:多线程及框架
面试官:接下来,我们深入一点:
- 讲讲线程池的核心参数及优化思路。
- Spring中Bean的生命周期是怎样的?
- MyBatis的一级缓存和二级缓存有什么区别?
谢飞机:哎呀,这些问题好高端!
- 线程池的核心参数……好像有线程数吧?优化的话,多用点线程呗。
- Spring的Bean生命周期……它会生老病死?
- MyBatis一级缓存和二级缓存……一级在代码里,二级在数据库里?
面试官:(扶额)继续。
第三轮:分布式及高并发
面试官:最后一轮,我们谈谈分布式相关:
- Redis是单线程的,为什么性能这么高?
- RabbitMQ和Kafka在使用场景上的区别是什么?
- 设计一个秒杀系统的架构,你会怎么做?
谢飞机:嗯,让我想想:
- Redis是单线程的,但它可能有多线程吧?
- RabbitMQ和Kafka的区别……它们名字不一样?
- 秒杀系统嘛,用个大服务器抗住就行!
面试官:(沉默片刻)谢飞机,你回去等通知吧。
技术知识点详解
第一轮答案
HashMap的工作原理
- HashMap通过键的
hashCode()计算出哈希值,然后通过哈希值找到对应的桶(bucket)。 - 如果发生哈希冲突,会通过拉链法或红黑树解决。
- JDK1.8后,引入了红黑树来优化链表性能。
- HashMap通过键的
ArrayList和LinkedList的区别
- ArrayList基于动态数组实现,随机访问速度快,但增删元素时性能较低。
- LinkedList基于链表实现,增删元素性能高,但随机访问速度慢。
JVM内存模型
- JVM内存分为堆、栈、方法区、本地方法栈等。
- 堆存储对象实例,栈存储方法调用和局部变量。
第二轮答案
线程池的核心参数及优化思路
- 核心参数包括核心线程数、最大线程数、空闲线程存活时间、任务队列。
- 优化思路:合理设置线程数,避免过多线程导致上下文切换;选择适合的任务队列。
Spring中Bean的生命周期
- 创建:实例化Bean对象。
- 初始化:调用初始化方法。
- 使用:Bean被应用程序使用。
- 销毁:容器关闭时销毁Bean。
MyBatis的一级缓存和二级缓存区别
- 一级缓存是SqlSession级别的缓存,默认开启。
- 二级缓存是Mapper级别的缓存,需要手动开启。
第三轮答案
Redis性能高的原因
- Redis是单线程的,但采用了事件驱动模型,避免了线程切换开销。
- 数据都在内存中,访问速度极快。
RabbitMQ和Kafka的区别
- RabbitMQ适合低延迟、高并发的消息传递。
- Kafka适合日志存储、大数据处理。
秒杀系统的架构设计
- 前端限流,避免瞬时高并发。
- 使用Redis作为库存缓存,减少数据库压力。
- 异步消息队列处理订单。
