面试官:Java线程池的核心参数了解吗?谢飞机:会用new Thread就不错了!
面试官:请坐,先简单自我介绍一下。
谢飞机:面试官好,我叫谢飞机,三年Java开发经验,精通增删改查,熟悉Spring全家桶,会写SQL,能看懂Linux命令……
面试官(微微一笑):不错,那我们开始技术环节。先从基础开始——ArrayList 和 LinkedList 的区别是什么?
谢飞机:这个我会!ArrayList 是基于数组实现的,查询快,增删慢;LinkedList 是基于链表实现的,增删快,查询慢。
面试官:很好,理解到位。那 HashMap 的底层结构呢?JDK 8 之后有什么优化?
谢飞机:HashMap 底层是数组 + 链表 + 红黑树。当链表长度超过 8 且数组长度大于 64 时,链表转成红黑树,提升查找性能。
面试官:不错,基础扎实。那 ConcurrentHashMap 呢?它是怎么实现线程安全的?
谢飞机:嗯……它用了 synchronized?不对不对,好像是 CAS + synchronized?哦对!JDK 8 用的是 CAS + synchronized,锁的是链表头节点。
面试官:还行,基本答出来了。那我们聊聊多线程。创建线程的方式有哪些?
谢飞机:四种!继承 Thread,实现 Runnable,实现 Callable,还有线程池。
面试官:很好。那你说说线程池的核心参数有哪些?
谢飞机:啊?核心参数?嗯……corePoolSize、maximumPoolSize、workQueue……还有……keepAliveTime?好像还有一个……名字太长我忘了。
面试官:叫 threadFactory,最后一个叫 handler,拒绝策略。
谢飞机:对对对!就是它!我都背过,一紧张忘了。
面试官:那如果队列满了,会发生什么?
谢飞机:那就新建线程,直到最大线程数,再满了……就报错?
面试官:不一定报错,取决于拒绝策略。比如 AbortPolicy 就是抛异常,CallerRunsPolicy 是由调用者线程执行。
谢飞机:哦哦,原来如此。
面试官:继续。Spring 中 Bean 的作用域有哪些?
谢飞机:singleton、prototype,还有 request、session……
面试官:很好。那 Bean 的生命周期了解吗?
谢飞机:嗯……Spring 创建 Bean,然后初始化,最后销毁。具体流程……记不清了。
面试官:我们跳过。Redis 用过哪些数据结构?
谢飞机:String、Hash、List、Set、ZSet!
面试官:很好。那 Redis 实现分布式锁要注意什么?
谢飞机:要用 SETNX!还要设置过期时间!防止死锁!
面试官:那如果业务还没执行完,锁过期了怎么办?
谢飞机:呃……加个定时任务,续命?
面试官:那是看门狗机制。你了解过 Redisson 吗?
谢飞机:听说过,但没用过……
面试官:最后一个问题。MySQL 的索引失效场景有哪些?
谢飞机:like 左模糊会失效,比如 '%abc';还有对字段做函数操作,比如 where date(create_time) = '2024-01-01';或者类型转换,比如字符串字段传了数字……
面试官:不错,回答得挺全面。今天先到这里,回去等通知吧。
谢飞机:好的,谢谢面试官!
答案详解
1. ArrayList vs LinkedList
- ArrayList:基于动态数组,支持随机访问,查询 O(1),增删 O(n)(需移动元素)。
- LinkedList:基于双向链表,增删 O(1)(已知位置),查询 O(n)。
- 使用场景:频繁查询用 ArrayList,频繁增删用 LinkedList。
2. HashMap 底层结构(JDK 8+)
- 数组 + 链表 + 红黑树。
- 当链表长度 ≥ 8 且哈希桶数组长度 ≥ 64 时,链表转红黑树(减少查找时间复杂度从 O(n) 到 O(log n))。
- 扩容机制:负载因子默认 0.75,容量翻倍。
3. ConcurrentHashMap 线程安全实现(JDK 8)
- 使用 CAS + synchronized。
- 锁粒度更细:synchronized 锁住的是链表头节点或红黑树根节点,而不是整个桶。
- 不允许 key/value 为 null(避免歧义)。
4. 线程池核心参数(ThreadPoolExecutor)
- corePoolSize:核心线程数,常驻线程。
- maximumPoolSize:最大线程数。
- keepAliveTime:非核心线程空闲存活时间。
- unit:时间单位。
- workQueue:任务队列(如 LinkedBlockingQueue)。
- threadFactory:线程工厂,可自定义线程命名等。
- handler:拒绝策略(AbortPolicy、CallerRunsPolicy 等)。
5. Spring Bean 作用域
- singleton:单例(默认)。
- prototype:每次获取都创建新实例。
- request/session/application:Web 环境下对应生命周期。
6. Redis 分布式锁注意事项
- 使用
SET key value NX EX seconds原子操作。 - 设置唯一 value(如 UUID)防止误删。
- 锁续期:Redisson 的看门狗机制自动续期。
- 防止锁失效:业务执行时间 > 过期时间时,需异步续期。
7. MySQL 索引失效场景
- 左模糊查询:
LIKE '%abc' - 对字段使用函数或表达式:
WHERE YEAR(create_time) = 2024 - 类型不匹配:字符串字段传数字导致隐式转换
- OR 条件部分无索引
- 最左前缀原则破坏:联合索引
(a,b,c)查询条件未包含 a