四达时代 Java 开发一面面经

四达时代 · java · 一面 · 2026-04

面试题目

  1. 自我介绍一下。
  2. 学 Java 一共学几年了?
  3. (笔试题)手机号格式化那道题,你当时的解题思路是什么?手机号位数有九位、十位,你是怎么找的?
  4. 给你一个字符串,里面有中文、英文、数字等各种字符,如何打印出其中连续 11 位数字?正则表达式怎么写?
  5. Java 8 中 HashMap 的底层实现原理是什么?它线程安全吗?如果不安全,用哪个集合?
  6. HashMap 的 get 过程是怎样的?哈希值是怎么算的?
  7. Java 中的锁你知道哪些?说一下 synchronized 的底层原理(对象锁)。
  8. 对象头里的 Mark Word 是怎么区分不同锁级别的?
  9. 线程池的四种拒绝策略分别是什么?哪一种是默认的?
  10. Java 中 IO 和 NIO 有什么区别?
  11. 类加载器的双亲委派机制怎么理解?
  12. 介绍一下 MVCC(多版本并发控制)。
  13. Linux 上如何全局查找一个文件(如 A.java)?
  14. 平时开发的项目是微服务部署吗?分布式锁和分布式事务这块研究得怎么样?
  15. 场景题:公司年会抽奖,一等奖 10 个,二等奖 20 个,三等奖 70 个,要求每个员工抽中一等奖的概率为 1%。你怎么实现?

参考解析

  • HashMap底层: Java 8 使用数组+链表+红黑树。不安全,并发建议用 ConcurrentHashMap(分段锁/CAS+synchronized)。
  • synchronized原理: 基于对象头中的 Mark Word 实现,通过 monitorenter 和 monitorexit 指令加锁与释放,支持锁升级(偏向锁->轻量级锁->重量级锁)。
  • 线程池拒绝策略: AbortPolicy(默认,抛异常)、CallerRunsPolicy(调用者线程运行)、DiscardPolicy(直接丢弃)、DiscardOldestPolicy(丢弃最旧)。
  • 双亲委派: 类加载请求先交给父类加载器处理,只有父类无法完成时才由当前加载器处理,保证核心类库不被篡改。
  • MVCC: 主要通过记录行的隐藏列(创建/删除版本号)和 Read View(快照读)实现,在不加读锁的情况下保证并发读写的数据可见性。
  • 抽奖算法实现: 可使用区间随机数法。将总人数或奖池划分为对应的概率区间(如0-0.01为一等奖),生成 0-1 随机数落入哪个区间即判定中奖。