谢飞机的Java面试历险记:从HashMap到Redis的爆笑求职路
【场景:某大厂会议室,面试官推了推眼镜,谢飞机搓着手,T恤印着“Hello World”】
面试官:谢同学,先说说HashMap在JDK1.8中为什么用红黑树?谢飞机:啊?红黑树…是…是怕链表太长,就让它变黑一点?(挠头)
面试官(略停顿):…那如果并发put,会死循环吗?谢飞机:不会!我用ConcurrentHashMap!它…它有16个桶!
面试官(点头):嗯,桶数是对的。那线程池的拒绝策略有哪些?谢飞机:有…有AbortPolicy,还有…还有…(小声)“回家等通知”策略!
面试官微微一笑:“今天就到这里吧,谢同学,回去等通知。”
【答案详解】
- HashMap红黑树:当链表长度≥8且数组长度≥64时转为红黑树,避免哈希碰撞导致O(n)查找退化;红黑树保证最坏O(log n)。
- 并发死循环:JDK1.7中扩容可能引发环形链表,但1.8已改为尾插+CAS,无此问题。
- 拒绝策略:共4种——AbortPolicy(抛异常)、CallerRunsPolicy(调用者线程执行)、DiscardPolicy(静默丢弃)、DiscardOldestPolicy(丢弃队首任务)。