互联网大厂Java面试实录:严肃面试官与水货程序员谢飞机的对决
第一轮:Java基础与集合
面试官:谢飞机,先简单介绍一下ArrayList和LinkedList的区别吧。
谢飞机:啊?ArrayList是数组,LinkedList是链表,一个快一个慢,对吧?
面试官(点头):不错,ArrayList基于动态数组,查询快但增删慢;LinkedList基于双向链表,增删快但查询慢。
面试官:HashMap的底层原理是什么?
谢飞机:嗯……就是键值对,用哈希表存的?
面试官(微笑):对,但更详细一点,HashMap在JDK8后是数组+链表+红黑树的结构,哈希冲突时用链表,链表过长转红黑树。
面试官:线程安全的集合有哪些?
谢飞机:Vector和HashTable!
面试官(满意):没错,还有ConcurrentHashMap、CopyOnWriteArrayList等。
第二轮:JUC与多线程
面试官:说说线程池的核心参数有哪些?
谢飞机:核心线程数、最大线程数、队列……还有啥来着?
面试官(补充):还有存活时间和拒绝策略。
面试官:synchronized和ReentrantLock的区别?
谢飞机:一个关键字,一个类?
面试官(笑):对,但ReentrantLock更灵活,支持公平锁、可中断、多条件变量。
面试官:什么是AQS?
谢飞机:啊?AQS是……队列同步器?
面试官(摇头):AQS是AbstractQueuedSynchronizer,是JUC的核心框架。
第三轮:框架与中间件
面试官:Spring的IoC和AOP是什么?
谢飞机:IoC是控制反转,AOP是面向切面编程!
面试官(赞许):对,IoC解耦对象依赖,AOP解耦横切逻辑。
面试官:Redis的持久化机制有哪些?
谢飞机:RDB和AOF?
面试官(点头):RDB是快照,AOF是日志追加。
面试官:MySQL的索引失效场景?
谢飞机:用了函数、or条件、like模糊查询?
面试官(满意):还有is null、!=等。
面试结束
面试官:好的,谢飞机,今天的面试就到这里,回去等通知吧。
谢飞机:好的,谢谢!(心想:终于结束了……)
问题答案详解
-
ArrayList vs LinkedList:
- ArrayList基于动态数组,支持随机访问,增删慢(需移动元素)。
- LinkedList基于双向链表,增删快(只需改指针),查询慢(需遍历)。
-
HashMap原理:
- JDK8后结构为数组+链表+红黑树,哈希冲突时链表长度超过8转红黑树。
- 扩容时容量翻倍,重新哈希分布。
-
线程安全集合:
- Vector、HashTable(全表锁);
- ConcurrentHashMap(分段锁/CAS);
- CopyOnWriteArrayList(写时复制)。
-
线程池参数:
- corePoolSize:核心线程数;
- maximumPoolSize:最大线程数;
- keepAliveTime:非核心线程空闲存活时间;
- workQueue:任务队列;
- RejectedExecutionHandler:拒绝策略(如AbortPolicy)。
-
synchronized vs ReentrantLock:
- synchronized是关键字,自动释放锁;
- ReentrantLock是类,需手动释放,支持公平锁、可中断、多条件变量。
-
AQS:
- AbstractQueuedSynchronizer,JUC核心框架;
- 通过CLH队列和state变量实现锁和同步器(如ReentrantLock、CountDownLatch)。
-
Spring IoC/AOP:
- IoC:控制反转,由容器管理对象依赖(如@Autowired);
- AOP:面向切面编程,解耦横切逻辑(如@Transactional)。
-
Redis持久化:
- RDB:定时快照,恢复快但可能丢数据;
- AOF:日志追加,数据更安全但文件大。
-
MySQL索引失效:
- 使用函数(如SUBSTRING);
- or条件(除非所有列都有索引);
- like模糊查询(如'%abc');
- is null、!=等操作。