面试现场
面试官:今天咱们聊些实战问题,你先简单介绍一下自己。
范小旭:(摸头)您好,我是范小旭,一个在互联网行业摸爬滚打的Java程序员,虽然有时候...(突然正经)不过我对技术还是很有热情的!
面试官:很好,那我们开始吧。先问个基础的:Java中的HashMap如何处理哈希冲突?
范小旭:(自信)用链表+红黑树!当链表长度超过阈值时会转成红黑树,这样查询效率更高!
面试官:(点头)不错。那说说JUC包中的CountDownLatch原理?
范小旭:(挠头)这个...它应该用到了AQS,通过state变量来控制线程等待?(不确定)
面试官:(微笑)继续。JVM内存模型包含哪些区域?
范小旭:(突然激动)方法区、堆、栈、程序计数器、本地方法栈!(突然停顿)啊...还有元空间?
面试官:(鼓掌)很好。现在看个复杂场景:线程池拒绝策略有哪些类型?
范小旭:(慌张)哦哦哦,有Abort、CallerRuns、Discard...(突然)还有...还有...(看向窗外)
面试官:(递茶)别紧张。说说Spring的AOP实现原理?
范小旭:(突然认真)基于动态代理,如果是接口就用JDK代理,没有接口用CGLIB!(突然)不过现在Spring Boot都自动配置了...
面试官:(点头)最后一个问题:Redis的ZIPList和HT结构在什么场景下使用?
范小旭:(沉默三秒)这个...应该和数据量有关?小数据用ZIPList,大数据用HT?(不确定)
面试官:(起身)好的,今天就到这里。我们会尽快通知结果。
高频问题解析
-
HashMap哈希冲突:
- 使用链表+红黑树结构
- 链表长度超过8时转换
- 时间复杂度从O(n)提升到O(logn)
-
CountDownLatch原理:
- 基于AQS的共享锁机制
- state变量控制等待线程
- await()方法会阻塞直到state为0
-
JVM内存区域:
- 程序计数器(线程私有)
- Java虚拟机栈(线程私有)
- 方法区(所有线程共享)
- 堆(所有线程共享)
- 本地方法栈(线程私有)
-
线程池拒绝策略:
- AbortPolicy:抛异常
- DiscardPolicy:直接丢弃
- DiscardOldestPolicy:丢弃队列头任务
- CallerRunsPolicy:由调用线程处理
-
Spring AOP:
- JDK动态代理(基于接口)
- CGLIB代理(基于类)
- 通过Advisor进行切面织入
-
Redis数据结构:
- ZIPList:小对象存储(<512字节)
- HT:大数据量存储
- Ziplist压缩算法优化内存