ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Java面试高频考点解析:从集合框架到微服务架构

Java面试高频考点解析:从集合框架到微服务架构 1. 面试场景还原从基础到高阶的Java技术考察谢飞机坐在腾讯大厦的会议室里手心微微出汗。对面的面试官推了推眼镜开始了这场技术交锋先说说Java集合框架中ArrayList和LinkedList的区别面试官抛出了第一个问题。谢飞机调整呼吸答道ArrayList基于动态数组随机访问O(1)但插入删除O(n)LinkedList基于双向链表插入删除O(1)但随机访问O(n)。实际选择要看业务场景——比如电商购物车频繁增删商品用LinkedList而需要快速索引的报表数据更适合ArrayList。面试官点评候选人不仅说出了标准答案还能结合业务场景分析这种思维值得肯定面试官接着追问那HashMap的负载因子为什么默认是0.75谢飞机暗自庆幸昨晚复习过源码这是空间和时间成本的折中。0.75时链表转红黑树的概率约0.00000006resize次数也合理。如果设置0.5虽然哈希冲突少但空间浪费1.0又会导致严重哈希碰撞。1.1 Spring框架的连环追问说说Spring Bean的生命周期面试官切换了话题。谢飞机在白板上画出流程图实例化Bean属性填充Autowired初始化InitializingBean使用阶段销毁DisposableBean特别注意循环依赖问题谢飞机补充道三级缓存解决的就是构造函数注入时的循环依赖。比如ServiceA依赖ServiceBSpring会先暴露半成品对象。面试官突然抛出陷阱问题Transactional注解在同类方法调用时为什么不生效谢飞机快速反应因为Spring AOP基于动态代理内部方法调用不走代理对象。解决方案有三种1拆分成不同类 2手动获取代理对象 3使用AspectJ编译时织入。1.2 微服务架构的实战拷问你们项目怎么保证微服务的数据一致性面试官进入深水区。谢飞机列举了几种方案最终一致性消息队列本地事件表TCC模式预留/确认/取消SAGA长事务分布式事务框架Seata我们订单系统用的是RocketMQ事务消息谢飞机举例说明先发half消息本地事务成功后再提交二次确认。这里有个坑——消息查证接口要实现幂等我们用了redislua脚本防重复处理。2. 高频考点深度剖析Java核心机制2.1 JVM内存模型实战理解面试官在白板上画出一个JVM结构图解释下方法区、堆、栈的关系谢飞机接过笔标注方法区存储类信息JDK8后是元空间堆对象实例和数组栈局部变量和方法调用注意字符串常量池的位置变化谢飞机特别指出JDK7从方法区移到堆这样能避免永久代内存溢出。我们线上就遇到过Metaspace爆满的问题最后通过-XX:MaxMetaspaceSize参数解决。2.2 并发编程的魔鬼细节写个死锁的例子面试官突然要求现场编码。谢飞机迅速写出经典案例Object lock1 new Object(); Object lock2 new Object(); new Thread(() - { synchronized(lock1) { Thread.sleep(100); synchronized(lock2) { /* 卡在这里 */ } } }).start(); new Thread(() - { synchronized(lock2) { Thread.sleep(100); synchronized(lock1) { /* 卡在这里 */ } } }).start();排查死锁可以用jstack谢飞机继续补充我们生产环境用Arthas的thread -b命令更直观。预防死锁要遵循1固定加锁顺序 2使用tryLock 3设置超时时间。3. 数据库与缓存的高阶问答3.1 MySQL索引的优化实践说说B树索引的原理面试官问道。谢飞机用笔记本演示相比B树B树非叶子节点只存key能放更多索引数据全在叶子节点且用链表连接适合范围查询。这就是为什么InnoDB主键推荐自增——避免页分裂。面试官追问遇到过索引失效的情况吗谢飞机苦笑太多了最典型的是使用!或not in对索引列做运算隐式类型转换最左前缀缺失我们有次接口超时EXPLAIN发现本该走索引的字段因为使用了SUBSTRING()函数导致全表扫描。3.2 Redis的持久化策略Redis的RDB和AOF怎么选面试官继续深挖。谢飞机对比道RDB二进制快照恢复快但可能丢数据AOF记录每条命令更安全但文件大我们混合使用谢飞机分享实战经验主节点开AOF每秒刷盘从节点用RDB做备份。注意AOF重写会fork子进程如果内存太大可能阻塞主线程我们通过控制auto-aof-rewrite-min-size避免频繁重写。4. 系统设计能力考察4.1 秒杀系统架构设计如何设计一个百万QPS的秒杀系统面试官抛出压轴题。谢飞机在白板上画出分层架构前端静态资源CDN按钮灰度计数防抖随机丢弃请求网关层限流令牌桶黑名单过滤请求聚合服务层缓存预热库存分段扣减异步下单队列数据层Redis集群库存扣减Lua脚本最终一致性补偿关键点是预扣库存和实际库存分离谢飞机强调我们用Redis的DECR原子操作扣减预库存MQ异步处理真实订单。遇到过Redis集群脑裂导致超卖后来引入ZooKeeper做分布式锁才解决。4.2 微服务治理实践说说你们怎么管理上百个微服务面试官问道。谢飞机展示技术栈注册中心Nacos支持AP/CP切换配置中心携程Apollo流量控制Sentinel链路追踪SkyWalking服务网格Istio最头疼的是接口幂等问题谢飞机分享踩坑经历我们给每个请求生成唯一traceId配合Redis原子操作实现防重。注意Redis集群模式下Lua脚本要用hash tag保证落在同一节点。面试最后面试官突然问如果让你设计一个分布式ID生成器会考虑哪些因素谢飞机沉着应答全局唯一趋势递增高可用低延迟常用方案有UUID、雪花算法、Redis原子incr。我们改进过雪花算法——机器ID改用ZooKeeper持久节点分配避免手动配置时间回拨时启动备用worker。
返回列表