字节跳动
字节跳动是全球领先的互联网科技公司,旗下拥有抖音、TikTok、今日头条等爆款产品。技术栈以 Go 和 Java 为主,推崇微服务架构和云原生实践。面试风格注重基础原理与实战场景结合,算法题难度中等偏上,常考动态规划与系统设计。面试相对严格,基本每一轮技术面试都有手撕算法环节。
题目 1:请解释一下 HashMap 的底层实现原理?
问题描述:面试官常问:"HashMap 的底层数据结构是什么?put 和 get 的流程是怎样的?扩容机制如何工作?"
答案要点:
- 数据结构:JDK1.8 后采用数组 + 链表/红黑树。当链表长度≥8 且数组长度≥64 时转为红黑树,提高查询效率;当红黑树节点≤6 时退化为链表。
- put 流程:
- 计算 key 的 hash 值
(h = key.hashCode()) ^ (h >>> 16) - 定位数组下标
(n-1) & hash - 如果桶为空,直接放入;否则遍历链表/树
- key 相同则覆盖 value,不同则插入(尾插法)
- 计算 key 的 hash 值
- 扩容机制:默认负载因子 0.75,当 size≥threshold(容量×负载因子)时,容量翻倍为 2 的幂次方,并重新 hash 所有元素。
- 线程安全性:多线程下可能导致死循环(JDK1.7 头插法)或数据丢失,推荐用 ConcurrentHashMap。
扩展提示:记住"为什么 HashMap 容量是 2 的幂次方"——为了用
(n-1) & hash代替取模运算,提高效率。
题目 2:手写一个单例模式(双重校验锁)
问题描述:写一个线程安全的单例模式,要求考虑性能。
代码示例:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
答案要点:
- :禁止指令重排,确保 instance 对象的初始化在多线程环境下可见。


