LinkedHashMap 如何实现 LRU 缓存
HashMap 是 Java 后端最常用的数据结构之一。它适合通过 key 快速找到 value,平均情况下查询、插入接近 O(1)。真正理解 HashMap,要抓住三个点:数组、链表/红黑树、扩容。
基本使用
Map<Long, String> userMap = new HashMap<>(); |
HashMap 会先根据 key 的 hash 值定位数组下标。如果多个 key 落在同一个位置,就会形成冲突,Java 8 以后冲突链较长时会转成红黑树。
扩容为什么要注意
默认负载因子是 0.75。元素数量超过阈值时,HashMap 会扩容,数组容量通常变成原来的 2 倍。扩容需要重新分布元素,所以如果你大概知道数据量,建议初始化容量:
Map<Long, String> userMap = new HashMap<>(1024); |
常见坑
- HashMap 不是线程安全的,多线程写入要用 ConcurrentHashMap。
- 自定义对象作为 key 时,要正确重写 equals 和 hashCode。
- 不要在遍历 Map 时直接修改结构,必要时用迭代器或收集后再处理。