恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
大厂 Java 面试实录:谢飞机大战严肃面试官
首页
资讯中心
/
大厂 Java 面试实录:谢飞机大战严肃面试官
大厂 Java 面试实录:谢飞机大战严肃面试官
发布时间:2026/9/6 4:46:58
大厂 Java 面试实录谢飞机大战严肃面试官场景互联网大厂终面。会议室里空气很冷面试官表情更冷。谢飞机抱着简历坐下努力把自己伪装成“懂点 Java 的人”。第一轮Java 核心与集合面试官先来个简单的。重载和重写有什么区别谢飞机重载是同一个类里方法名一样、参数列表不同重写是子类对父类方法进行覆盖方法签名要一致返回值可以协变。面试官嗯这题答得还行至少没有把“覆盖”说成“复制粘贴”。面试官那ArrayList为什么查询快插入某些位置又慢谢飞机因为它底层是数组支持下标随机访问所以查找快但中间插入或删除时要移动后面的元素所以慢。面试官不错像是认真学过。面试官那HashMap为什么能做到接近 O(1) 的查找谢飞机先算hashCode再做扰动和取模定位桶位置桶里如果冲突了再靠链表或者红黑树去找目标。面试官嗯方向对。面试官那你说说HashMap的扩容机制。谢飞机它会先把容量翻倍然后把所有元素跳一遍舞重新分配到新桶里……应该是这样吧面试官行了知道你在努力活跃气氛了下一题。面试官如果两个对象要放进HashMap里equals和hashCode什么关系谢飞机我感觉它俩像身份证和门牌号先看门牌号再看身份证能一起判断是不是同一个人。面试官比喻糙了点但勉强能听。第二轮JUC、多线程与线程池面试官现在进入高并发场景。比如秒杀下单你怎么理解volatile谢飞机volatile主要保证可见性变量一改其他线程能立刻看到它还能一定程度上禁止指令重排序。面试官这个回答可以说明你至少知道线程不是“共用脑子”。面试官那synchronized和ReentrantLock有什么区别谢飞机synchronized是 JVM 层面的关键字简单好用自动加锁解锁ReentrantLock是 API 层面的锁功能更灵活能尝试获取锁、可中断、支持公平锁还能配合条件队列。面试官很好终于不是“都能锁住”这种回答了。面试官如果订单创建后要异步发短信、发优惠券、记日志你会怎么设计线程池谢飞机我会先分析任务类型。短信和日志是 I/O 型任务可以用较多线程如果是 CPU 型计算线程数不要太多。线程池我会关注核心线程数、最大线程数、队列大小、线程工厂、拒绝策略。面试官继续。面试官那你说说线程池满了怎么办谢飞机这个……可以把拒绝策略改成“谁提交谁自己干”这样系统绝不会拒绝。面试官你这是把生产事故变成了个人崩溃。面试官再来AQS是什么谢飞机AQS 就是“俺也看不懂的同步器”面试官很好看来你对自己很诚实。第三轮JVM、Spring、SpringBoot、MyBatis、Dubbo、RabbitMQ面试官最后一轮系统设计相关。你先说说 JVM 运行时内存区域。谢飞机有程序计数器、Java 虚拟机栈、本地方法栈、堆、方法区。线程私有的是计数器和栈线程共享的是堆和方法区。面试官可以基础扎实。面试官那对象一般在哪里分配垃圾回收主要回收什么谢飞机对象主要在堆上分配垃圾回收回收不再被引用的对象。GC 会通过可达性分析判断对象是否存活。面试官嗯。面试官Spring 里 Bean 的生命周期你说一下最好结合我们项目里的“订单服务”。谢飞机Spring 容器先实例化 Bean再进行属性填充接着调用各种Aware然后执行 BeanPostProcessor 的前置处理初始化方法最后放入容器容器销毁时还会触发销毁回调。面试官不错思路清楚。面试官那 SpringBoot 为什么开发快谢飞机因为它减少了大量手动配置自动配置会根据类路径和环境条件装配 Bean内嵌 Tomcat 也省掉了部署外部容器的麻烦。面试官这个回答挺标准。面试官MyBatis 里为什么有时候你写了 SQL结果对象字段却映射不上谢飞机可能是字段名和属性名不一致没开下划线转驼峰也可能是resultMap没配好或者 SQL 别名写错了。面试官还行至少知道不是“数据库闹脾气”。面试官我们业务里支付成功后要通知多个系统为什么用 RabbitMQ谢飞机因为可以解耦、削峰、异步。支付成功后先把消息发到 MQ订单、积分、短信系统各自消费如果某个系统慢也不会直接拖垮主流程。面试官很好那消息丢了怎么办谢飞机这个……丢了就说明它很自由。面试官你自由得有点危险了。面试官最后一个Dubbo 和直接 HTTP 调用相比优势是什么谢飞机Dubbo 更偏向 RPC接口调用更像本地方法支持注册中心、负载均衡、超时、重试、集群容错等适合内部服务间调用。面试官行今天就到这儿吧。你先回去等通知后续有消息我们会联系你。谢飞机好的我回去等一个“有消息”的消息。面试题答案详解1. Java 核心知识重载 vs 重写重载同一个类中方法名相同参数列表不同。重写子类重新实现父类方法方法名、参数列表、返回值规则基本保持一致。重写遵循里氏替换原则便于多态。equals 和 hashCodehashCode()用于快速定位对象所在的桶。equals()用于判断两个对象内容是否相等。约定如果两个对象 equals 相等那么 hashCode 必须相等。反过来不一定成立hashCode 相等不代表对象一定相等。放入HashMap、HashSet时这两个方法非常关键。2. ArrayList为什么查询快底层是动态数组支持通过下标随机访问。访问元素时间复杂度接近O(1)。为什么插入删除慢在中间插入或删除元素时需要移动大量元素。最坏情况复杂度是O(n)。扩容机制底层数组容量不够时会进行扩容。旧数组元素复制到新数组中通常是按一定比例扩容以减少频繁扩容带来的开销。3. HashMap快速查找原理调用 key 的hashCode()。进行扰动计算降低 hash 冲突。通过取模或位运算定位到桶。在桶内查找目标元素。冲突解决JDK 8 前主要是链表。JDK 8 后当链表过长时会转换成红黑树提高查询效率。为什么线程不安全多线程同时修改时可能出现数据覆盖、结构混乱、扩容异常等问题。如果需要并发 Map可考虑ConcurrentHashMap。4. volatile保证可见性一个线程修改后其他线程能立即看到。一定程度保证有序性禁止部分指令重排序。不保证原子性比如count不是原子操作。5. synchronized 和 ReentrantLocksynchronizedJVM 内置关键字。自动加锁和释放锁。使用简单适合一般同步场景。ReentrantLock显式锁。功能更丰富可中断、可尝试获取、可设置公平锁、支持多个条件变量。适合更复杂的并发控制。6. 线程池核心参数corePoolSize核心线程数。maximumPoolSize最大线程数。keepAliveTime非核心线程空闲多久回收。workQueue任务队列。threadFactory线程工厂。handler拒绝策略。使用场景异步发短信、发邮件、生成报表、日志归档等。I/O 型任务通常可适当增加线程数。CPU 型任务一般不宜开太多线程。拒绝策略AbortPolicy直接抛异常。CallerRunsPolicy提交任务的线程自己执行。DiscardPolicy直接丢弃任务。DiscardOldestPolicy丢弃队列中最老的任务。7. JVM运行时内存区域程序计数器记录当前线程执行到哪条字节码。Java 虚拟机栈存放方法调用栈帧。本地方法栈服务于 native 方法。堆对象主要分配在这里。方法区存储类信息、常量、静态变量等。垃圾回收通过可达性分析判断对象是否还可被引用。常见回收算法有标记清除、复制、标记整理等。年轻代、老年代会采用不同的回收策略。8. SpringBean 生命周期实例化属性填充Aware 回调BeanPostProcessor 前置处理初始化BeanPostProcessor 后置处理放入容器容器关闭时销毁事务失效常见原因同类内部自调用没有经过代理对象。方法不是public。异常被捕获吞掉导致事务无法回滚。数据源或事务管理器配置不正确。9. SpringBoot核心优势是自动配置和约定大于配置。通过条件装配自动根据类路径、配置文件、环境信息创建 Bean。内嵌 Tomcat/Jetty简化部署。非常适合快速构建微服务项目。10. MyBatis映射不上字段的原因数据库字段和 Java 属性名不一致。没有开启驼峰映射。resultMap配置错误。SQL 别名不正确。关键点#{}是预编译参数占位安全。${}是字符串拼接存在 SQL 注入风险。11. DubboDubbo 是高性能 RPC 框架适合内部服务调用。支持注册中心、负载均衡、超时、重试、集群容错。相比直接 HTTP 调用通常在接口治理和调用效率上更适合微服务内部通信。12. RabbitMQ为什么使用 MQ解耦生产者和消费者分开。削峰高并发流量先进入消息队列缓冲。异步提升主流程响应速度。关键机制ACK 确认消费者处理成功后确认消息防止消息丢失。重试消费失败后可重投或进入死信队列。持久化交换机、队列、消息可做持久化提升可靠性。死信队列处理多次消费失败或过期消息。典型业务场景支付成功后通知订单、积分、短信等多个系统。订单创建后异步发送邮件。秒杀活动削峰填谷。今天的面试就到这里。面试官回去等通知吧。谢飞机好的我会把“等通知”三个字等成一个系统。