互联网大厂Java求职面试实录:谢飞机的"水货"之路
第一轮提问
面试官:请介绍一下Java中的多线程实现方式。
谢飞机:这个...我用过Thread类,还有Runnable接口,还有Callable...对了,还有一个Future。
面试官:那你知道线程池的几种实现方式吗?
谢飞机:哦,线程池...我用过ThreadPoolExecutor,还有FixedThreadPool、CachedThreadPool这些。
面试官:你知道线程池的核心参数有哪些吗?
谢飞机:这个...核心线程数、最大线程数、空闲时间...还有那个拒绝策略?
面试官:那你知道拒绝策略的几种类型吗?
谢飞机:哦,有AbortPolicy、CallerRunsPolicy、DiscardPolicy...等等,还有一个...
面试官:那你知道线程池的工作流程吗?
谢飞机:这个...我好像记得一个队列,然后是核心线程、最大线程数...好像还有一条拒绝策略的规则?
第二轮提问
面试官:请说一下HashMap的底层实现原理。
谢飞机:这个...我用过HashMap,它内部有数组和链表,还有红黑树?
面试官:那你知道HashMap的扩容机制吗?
谢飞机:扩容...好像是当元素个数超过某个阈值就扩容?
面试官:那你知道HashMap的负载因子是什么?
谢飞机:负载因子...应该是0.75?
面试官:那你知道HashMap的哈希冲突是如何处理的?
谢飞机:哈希冲突?我好像记得用链表和红黑树来解决?
面试官:那你知道ConcurrentHashMap的实现原理吗?
谢飞机:ConcurrentHashMap...我用过它,好像是线程安全的?
第三轮提问
面试官:请你说一下SpringBoot的自动装配原理。
谢飞机:SpringBoot...我用过它,它会自动配置很多东西?
面试官:那你知道SpringBoot的starter机制吗?
谢飞机:starter...我用过它,它能快速集成一个组件?
面试官:那你知道MyBatis的执行流程吗?
谢飞机:MyBatis...我用过它,可以映射SQL?
面试官:那你知道Dubbo的负载均衡策略有哪些?
谢飞机:负载均衡...我记得有随机、轮询、最少活跃调用?
面试官:那你知道Redis的几种数据结构和使用场景吗?
谢飞机:Redis...我用过它,有字符串、哈希、列表、集合、有序集合?
结束语
面试官:好的,谢飞机,你回去等通知吧。
谢飞机:好的,谢谢!
面试答案详解
多线程实现方式
Java中实现多线程主要有三种方式:
- 继承Thread类:通过继承Thread类并重写run方法。
- 实现Runnable接口:实现Runnable接口的run方法。
- 实现Callable接口:与Runnable类似,但可以返回结果,并抛出异常。
线程池的实现方式和核心参数
线程池主要通过ThreadPoolExecutor类实现,核心参数包括:
- corePoolSize:核心线程数。
- maximumPoolSize:最大线程数。
- keepAliveTime:空闲线程存活时间。
- unit:keepAliveTime的时间单位。
- workQueue:工作队列,用于存储等待执行的任务。
- threadFactory:创建新线程时使用的工厂类。
- handler:拒绝策略,当任务无法被处理时的策略。
拒绝策略类型
- AbortPolicy:直接抛出异常。
- CallerRunsPolicy:调用者运行策略,让调用线程执行任务。
- DiscardPolicy:直接丢弃任务。
- DiscardOldestPolicy:丢弃队列中最老的任务。
HashMap底层实现原理
HashMap内部使用数组+链表(或红黑树)的结构,通过哈希函数计算元素位置。当链表长度超过阈值(默认为8)时,链表转红黑树。
HashMap扩容机制
当HashMap中元素个数超过容量*负载因子时,会触发扩容,新容量为原容量的两倍。
HashMap负载因子
默认负载因子为0.75,表示当元素个数超过容量的75%时会触发扩容。
ConcurrentHashMap实现原理
ConcurrentHashMap在JDK 1.7中使用Segment分段锁,JDK 1.8中使用CAS+同步锁实现线程安全。
SpringBoot自动装配原理
SpringBoot的自动装配通过@Import注解导入自动配置类,然后使用条件注解@ConditionalOnXXX来决定是否加载特定的Bean。
SpringBoot starter机制
starter是一个特殊的模块,它封装了特定功能的依赖和配置,使得开发者可以通过简单的配置快速集成特定组件。
MyBatis执行流程
- 读取MyBatis配置文件。
- 构建SqlSessionFactory。
- 通过SqlSession获取Mapper代理对象。
- 执行SQL语句。
Dubbo负载均衡策略
- 随机负载均衡(Random LoadBalance):随机选择一个提供者。
- 轮询负载均衡(RoundRobin LoadBalance):按权重轮询。
- 最少活跃调用(LeastActive LoadBalance):选择活跃调用数最少的提供者。
Redis数据结构和使用场景
- 字符串(String):适用于缓存、计数器等。
- 哈希(Hash):适用于存储对象的字段信息。
- 列表(List):适用于消息队列、时间线等。
- 集合(Set):适用于去重操作。
- 有序集合(Sorted Set):适用于排行榜、延迟队列等。