模块化前端框架设计:从原子状态到组合式架构的工程实践
2026/5/12 0:37:52
HashMap 本质上是一个数组 + 链表 + 红黑树的组合结构。
每个桶数组元素是一个 Node,Node 定义如下:
static class Node<K,V> implements Map.Entry<K,V> { final int hash; // 哈希值 final K key; // 键 V value; // 值 Node<K,V> next; // 下一个节点(链表指针) }put(K key, V value):插入/更新键值对get(Object key):根据键查找值remove(Object key):删除指定键containsKey(Object key):判断是否包含某个键containsValue(Object value):判断是否包含某个值size():元素个数isEmpty():是否为空clear():清空所有元素Collections.synchronizedMap(new HashMap<>())或ConcurrentHashMapMap<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); System.out.println(map.get("banana")); // 输出 2 map.remove("apple"); System.out.println(map.containsKey("apple")); // 输出 false每个 key 都有自己的hashCode()方法,HashMap 先调用 key 的hashCode(),然后再用扰动函数进一步处理,以减少哈希冲突。
典型扰动函数(JDK8):
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }这个操作将高位和低位混合,提高随机性,减少碰撞。
index = (n - 1) & hash,n 为数组长度,& 是位运算,比取模更快。size超过capacity * loadFactor时触发扩容。扩容是一个耗时操作,频繁扩容会影响性能,建议初始化时合理设置容量。
| Map 实现类 | 线程安全 | 有序性 | 底层结构 | 是否允许 null |
|---|---|---|---|---|
| HashMap | 否 | 无序 | 数组+链表+红黑树 | 允许 |
| LinkedHashMap | 否 | 插入顺序 | HashMap+双向链表 | 允许 |
| TreeMap | 否 | 按 key 排序 | 红黑树 | 不允许 null key |
| Hashtable | 是 | 无序 | 数组+链表 | 不允许 |
| ConcurrentHashMap | 是 | 无序 | 分段锁+数组+链表 | 不允许 null |
public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }new HashMap<>(1000)。ConcurrentHashMap替代。equals或hashCode方法中依赖可变属性。HashMap 是高效、灵活的键值对存储结构,广泛用于缓存、数据索引等场景。掌握其原理有助于编写高效且健壮的 Java 代码。
HashMap 是 Java 集合中最常用、最重要的 Map 实现之一。理解其底层原理、扩容机制、冲突处理、红黑树优化等,有助于写出高效且健壮的代码。面试、工作中常考,建议多结合源码和实际场景理解其设计哲学。