27届暑期后端高频面试题汇总(字节腾讯美团等多家大厂)

《面试题目》

  1. HashMap 底层数据结构 / 怎么扩容?(快手后端一面、字节中国交易与广告一面、转转Java实习、腾讯二面、腾讯云智一面等多家公司高频考点)
  2. 快手追问:哈希表遍历是有序还是随机?排序规则?怎么计算桶位(自定义对象呢)?
  3. 字节追问:Java 17 的 HashMap 插入/查找时间复杂度

《参考解析》

  1. HashMap 遍历顺序:HashMap 遍历顺序既不保证插入顺序也不是简单随机,而是由元素在哈希桶数组中的物理存储位置决定——遍历时按数组下标从小到大依次访问,同一个桶内按链表/红黑树内部顺序访问,因此看起来”无序”,实际上是由哈希值和数组容量共同决定的确定性顺序(相同输入在相同 JDK 版本下顺序稳定但不代表有业务含义的顺序)。
  2. 自定义对象计算桶位:HashMap 计算桶位的过程是先调用对象的 hashCode() 得到哈希值,再通过扰动函数(高16位与低16位异或)降低哈希冲突概率,最后与 (capacity - 1) 做按位与运算得到桶下标;自定义对象若要正确作为 key 使用,必须合理重写 hashCode()equals(),否则可能出现哈希分布不均或无法正确查找的问题。
  3. Java 17 HashMap 复杂度:插入和查找操作在没有哈希冲突或冲突较少(链表形态)时均摊时间复杂度为 O(1);当单桶链表长度达到树化阈值(8)且数组容量达到 64 时转为红黑树,此时最坏情况下复杂度优化为 O(log n),相比纯链表在极端哈希碰撞场景下的 O(n) 有显著提升,这一机制自 JDK1.8 引入后延续至今(含 JDK17)。