互联网大厂Java面试实录:严肃面试官与搞笑程序员铁蛋的爆笑对决
第一轮提问
面试官:铁蛋,你好!先简单介绍一下HashMap的工作原理吧。
铁蛋:嘿嘿,HashMap啊,就是存键值对的嘛!放进去的时候,它会根据键的hash值找到对应的桶,然后放进去。如果桶里已经有东西了,就用链表连起来!(得意)
面试官:(点头)不错,那你知道JDK8之后HashMap有什么优化吗?
铁蛋:优化?哦哦,链表太长会变成红黑树!这样查找更快!(挠头)
面试官:很好!那你能说说为什么HashMap是线程不安全的吗?
铁蛋:线程不安全?因为多个线程一起put可能会把数据搞乱吧……(心虚)
第二轮提问
面试官:接下来聊聊多线程吧。你知道什么是线程池的核心参数吗?
铁蛋:核心参数?corePoolSize、maximumPoolSize、queueCapacity……还有keepAliveTime!(自信)
面试官:不错!那如果任务队列满了,线程池会怎么处理?
铁蛋:满了?那就……拒绝呗!(笑)
面试官:具体有哪些拒绝策略?
铁蛋:呃……AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy!(突然想起来)
第三轮提问
面试官:最后聊聊Redis吧。Redis的持久化机制有哪些?
铁蛋:持久化?RDB和AOF呗!RDB是快照,AOF是记录命令!(轻松)
面试官:那你知道AOF的重写机制吗?
铁蛋:重写?就是把没用的命令删掉,变小一点……(含糊)
面试官:好的,今天的面试就到这里,你回去等通知吧。
问题答案详解
HashMap的工作原理
HashMap通过哈希表存储键值对,使用键的hashCode计算桶的位置。JDK8后,当链表长度超过8时,链表会转为红黑树以提高查询效率。线程不安全的原因是并发操作可能导致数据覆盖或链表成环。
线程池的核心参数
- corePoolSize:核心线程数。
- maximumPoolSize:最大线程数。
- queueCapacity:任务队列容量。
- keepAliveTime:非核心线程空闲存活时间。
Redis持久化机制
- RDB:定时生成数据快照,适合备份。
- AOF:记录每次写操作,重启时重放命令。AOF重写通过合并冗余命令减小文件体积。