Java面试全攻略:从基础到实战,互联网大厂技术栈深度解析
面试场景模拟
第一轮:Java基础与JVM
面试官:光头强,先来聊聊Java基础吧。Java中的String
、StringBuilder
和StringBuffer
有什么区别?
光头强:嘿嘿,这个简单!String
是不可变的,每次修改都会生成新对象;StringBuilder
和StringBuffer
是可变的,但StringBuffer
是线程安全的,StringBuilder
不是。
面试官:不错!那你能说说JVM的内存模型吗?
光头强:呃……这个嘛,JVM有堆、栈、方法区……(含糊其辞)
第二轮:并发编程
面试官:好,我们聊聊并发。synchronized
和ReentrantLock
有什么区别?
光头强:synchronized
是关键字,ReentrantLock
是类,后者更灵活,可以中断、超时……
面试官:很好!那你知道volatile
的作用吗?
光头强:这个……保证可见性?(不确定)
第三轮:Spring框架
面试官:Spring中@Autowired
和@Resource
有什么区别?
光头强:@Autowired
是Spring的,按类型注入;@Resource
是Java的,可以按名称注入。
面试官:不错!那Spring Boot的自动配置原理呢?
光头强:呃……这个有点复杂……(支支吾吾)
第四轮:中间件与数据库
面试官:Redis的持久化机制有哪些?
光头强:RDB和AOF!RDB是快照,AOF是日志。
面试官:很好!那MySQL的索引优化呢?
光头强:这个……用EXPLAIN
看看执行计划?(不确定)
第五轮:实战场景
面试官:假设你设计一个电商秒杀系统,如何保证高并发下的性能?
光头强:用Redis缓存库存,限流,异步下单……
面试官:不错!今天就到这里,回去等通知吧。
深度答案解析
1. Java基础与JVM
String
、StringBuilder
、StringBuffer
区别:String
不可变,适合少量操作;StringBuilder
非线程安全,性能高;StringBuffer
线程安全,性能稍低。- JVM内存模型:堆(对象实例)、栈(局部变量)、方法区(类信息)、程序计数器、本地方法栈。
2. 并发编程
synchronized
vsReentrantLock
:后者支持公平锁、可中断、超时等高级功能。volatile
:保证可见性和禁止指令重排序,但不保证原子性。
3. Spring框架
@Autowired
vs@Resource
:前者按类型注入,后者按名称注入。- Spring Boot自动配置:通过
@EnableAutoConfiguration
加载META-INF/spring.factories
中的配置类。
4. 中间件与数据库
- Redis持久化:RDB适合备份,AOF适合数据安全。
- MySQL索引优化:避免全表扫描,合理使用联合索引。
5. 实战场景
- 秒杀系统设计:
- 缓存预热:提前加载数据到Redis。
- 限流:使用令牌桶或漏桶算法。
- 异步处理:消息队列削峰填谷。
// 示例:Redis限流
public boolean tryAcquire(String key, int limit, int timeout) {
Jedis jedis = new Jedis("localhost");
String script = "local current = redis.call('get', KEYS[1])\n" +
"if current and tonumber(current) > tonumber(ARGV[1]) then\n" +
" return 0\n" +
"else\n" +
" redis.call('incr', KEYS[1])\n" +
" redis.call('expire', KEYS[1], ARGV[2])\n" +
" return 1\n" +
"end";
Object result = jedis.eval(script, Collections.singletonList(key), Arrays.asList(String.valueOf(limit), String.valueOf(timeout)));
return (long) result == 1;
}