ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

互联网大厂 Java 求职面试实战:面试官 VS 水货程序员谢飞机全程对话

互联网大厂 Java 求职面试实战:面试官 VS 水货程序员谢飞机全程对话 互联网大厂 Java 求职面试实战场景某互联网大厂技术部面试官严肃与自称“水货程序员”谢飞机进行技术面试。面试官提问涉及 Java 核心、JUC、JVM、并发、Spring 系列、MySQL、Redis、Docker、设计模式、DDD 等。谢飞机对简单问题还能答得有模有样复杂问题则胡乱答面试官随即点评。第 1 轮基础篇1.1 Java 基础面试官int i 128; Integer ii i; System.out.println(ii i);这段代码会输出什么为什么谢飞机会输出 true因为 Integer 会自动装箱。面试官好基本功扎实。1.2 集合——ArrayList HashMap面试官ArrayList 在扩容时会发生什么请说出扩容的阈值公式。谢飞机容量翻倍默认是 10。面试官还行补充一下默认容量是 10扩容时 newCapacity oldCapacity * 3/2 1。面试官HashMap 在 JDK8 之后的红黑树转化条件是什么谢飞机链表太长就会转成红黑树。面试官对具体是链表长度 8 并且当前 bucket 数量 64 时才会转化。1.3 Spring 基础面试官Spring Bean 的作用域有哪些请简述 prototype 与 singleton 的区别。谢飞机singleton 只会实例化一次prototype 每次都会 new。面试官很好补充一下 prototype Bean 不会被 Spring 管理完整生命周期如 destroy而 singleton 会。第 2 轮并发篇2.1 JUC - 锁面试官ReentrantLock 与 synchronized 有哪些区别谢飞机ReentrantLock 可以手动释放synchronized 不能。面试官对还可以响应中断、支持公平锁等。2.2 线程池面试官ThreadPoolExecutor 的核心参数 corePoolSize、maximumPoolSize、keepAliveTime、workQueue 各自作用是什么如果提交的任务数远大于 corePoolSize且 workQueue 为 SynchronousQueue会发生什么谢飞机corePoolSize 是最小线程数max 是最大队列满了就会创建新线程。面试官基本对补充SynchronousQueue 没有容量任务只能直接交给空闲线程否则会触发创建新线程直至达到 maximumPoolSize超过后抛 RejectExecutionException。2.3 JVM 垃圾收集面试官简述 CMS 与 G1 的主要区别以及各自适用的业务场景。谢飞机CMS 是老年代并发收集G1 是分代收集。面试官不完整。CMS 采用标记-清除并发标记停顿时间短但易产生碎片G1 将堆划分为多个 Region采用复制标记-整理兼顾吞吐和停顿适合大内存、对延迟敏感的业务。第 3 轮进阶篇3.1 微服务 RPC面试官Dubbo 的服务治理包括哪些方面请举例说明如何实现服务降级。谢飞机Dubbo 有注册中心、负载均衡、容错。降级可以直接返回默认值。面试官对补充容错策略里有 Failfast、Failover、Failsafe、Failback、Forking、Broadcast降级可以通过 Mock 配置或在业务侧捕获异常返回兜底数据。3.2 消息队列面试官RabbitMQ 的 Confirm 模式和事务模式有什么区别什么时候选用 Confirm谢飞机事务模式更安全。面试官对事务会阻塞Confirm 是异步回调性能更高适用于高吞吐场景。3.3 分布式任务调度 缓存面试官xxl‑job 与 Quartz 的区别是什么Redis 中的热点键问题怎么解决谢飞机xxl‑job 是分布式的Redis 用分片。面试官补充xxl‑job 支持分布式调度、动态下线、失败重试Quartz 本地单机调度。Redis 热点键可以通过加盐、预分裂、使用二级缓存或热点数据迁移到专用库来缓解。3.4 数据库 Docker面试官MySQL InnoDB 的事务隔离级别有哪些在高并发写入场景下如何避免死锁Docker 容器中如何保证 Java 程序的时区正确谢飞机有四种隔离级别死锁可以加锁顺序Docker 用 TZ 环境变量。面试官很好补充默认是 REPEATABLE READ避免死锁可以使用乐观锁、合理的索引、统一的加锁顺序。Docker 可以在启动时-e TZAsia/Shanghai或在容器内设置TZ环境变量。结束语面试官今天的面试到此结束谢飞机你先回去等我们后续通知吧。参考答案文章最后1. Java 基础Integer自动装箱ii i实际比较的是Integer对象与int的值ii会自动拆箱成int比较的是基本类型值结果为true。2. ArrayList 扩容默认容量new ArrayList()初始容量为 10。扩容公式newCapacity oldCapacity (oldCapacity 1)即 oldCapacity * 3/2JDK8 之后是oldCapacity oldCapacity / 2并在此基础上加 1 防止容量为 0。3. HashMap 红黑树转化触发条件当链表长度 8 且当前HashMap的 bucket 数量 64 时会把链表转换为红黑树以降低查询复杂度到 O(logN)。4. Spring Bean 作用域singletonSpring 容器启动时创建唯一实例整个容器生命周期内共享。prototype每次getBean都会创建新实例Spring 只负责初始化不管理完整生命周期如销毁。5. ReentrantLock vs synchronized可中断lock.lockInterruptibly()支持中断synchronized不行。公平锁ReentrantLock(true)可实现公平锁synchronized只能是非公平的。手动释放unlock()必须配对使用synchronized自动在代码块结束时释放。6. ThreadPoolExecutor 参数corePoolSize核心线程数空闲时不会被回收。maximumPoolSize线程池最大线程数。keepAliveTime非核心线程空闲时的存活时间。workQueue任务队列决定任务提交与线程创建的策略。SynchronousQueue 场景没有容量提交任务只能直接交给空闲线程若没有空闲线程则创建新线程直至maximumPoolSize超出后抛RejectedExecutionException。7. CMS vs G1CMSConcurrent Mark Sweep老年代并发标记-清除停顿时间短但会产生内存碎片适合对响应时间要求极高、堆内存相对较小的业务。G1Garbage‑First把堆划分为多个 Region默认 1‑32 MB采用并行标记 Region 复制/整理兼顾吞吐量和停顿时间适用于大内存4GB且对延迟敏感的业务。8. Dubbo 服务治理 降级治理维度注册中心、路由、负载均衡、容错、监控、限流、降级、灰度发布。降级实现Mock 配置在dubbo:service中配置mockreturn null或mockfail:…。业务侧兜底捕获RpcException返回默认数据或调用本地实现。熔断结合 Sentinel 等组件实现自动降级。9. RabbitMQ Confirm 与事务事务模式txSelect、txCommit、txRollback每条消息必须同步等待 broker 确认吞吐极低。Confirm 模式生产者在发送完消息后broker 异步返回ack/nack可以批量确认性能远高于事务适用于高并发、对可靠性有要求的场景。10. xxl‑job vs Quartzxxl‑job分布式调度中心支持动态下线、任务分片、失败重试、执行日志等适合微服务集群环境。Quartz单机/集群模式的本地调度库依赖数据库持久化适合单体或轻量级调度。11. Redis 热点键解决方案加盐Hash Tag在键名中加入随机后缀或前缀分散请求。预分裂使用hash slot如在集群模式下手动迁移热点键到独立节点。二级缓存在业务侧本地缓存热点数据降低对 Redis 的访问频率。热点数据分库将热点数据单独放在专用 Redis 实例或使用 LRU、LFU 淘汰策略。12. MySQL 事务隔离级别 死锁规避四大隔离级别READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ默认、SERIALIZABLE。避免死锁统一加锁顺序所有业务按相同顺序访问表/行。使用索引减少全表扫描导致的锁范围扩大。短事务尽量缩短事务持有锁的时间。乐观锁使用version字段或CAS避免行锁竞争。13. Docker 中 Java 时区方式一在docker run时通过环境变量设置-e TZAsia/Shanghai。方式二在 Dockerfile 中加入RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo Asia/Shanghai /etc/timezone。方式三启动 JVM 时加参数-Duser.timezoneAsia/Shanghai。小结本文通过面试官与“水货程序员”谢飞机的对话展示了从 Java 基础到微服务、分布式系统的全链路面试问题。答案部分对每个技术点做了细致的解释适合作为面试复盘或技术新人学习的参考材料。
返回列表