概述
Dart 中的 HashMap 是一个基于哈希表的 Map 实现,提供了高效的键值对存储和检索功能。 HashMap 是无序的(不保证迭代顺序),并且要求键必须具有一致的 Object.== 和 Object.hashCode 实现。
核心原理
1. 哈希表基础结构
HashMap 的底层实现基于数组(桶数组),通过哈希函数将键映射到数组索引:
bash
哈希函数: hash(key) → 数组索引
数组索引 = hash(key) & (capacity - 1)
2. 索引计算机制
Dart 使用位运算来计算桶索引,这比取模运算更高效:
java
/**
* 计算键在哈希表中的索引位置
* 使用位与运算替代取模运算,提高性能
* @param hashCode 键的哈希值
* @param capacity 桶数组的容量(必须是2的幂)
* @return 桶索引
*/
int calculateIndex(int hashCode, int capacity) {
return hashCode & (capacity - 1);
}
3. 冲突解决机制
当多个不同的键产生相同的桶索引时,就会发生哈希冲突。 Dart HashMap 使用**分离链接法(Separate Chaining)**来解决冲突:
kotlin
/**
* 哈希表节点结构
* 每个节点包含键值对和指向下一个节点的引用
*/
class HashMapEntry<K, V> {
K key; // 键
V value; // 值
int hashCode; // 缓存的哈希值
HashMapEntry<K, V>? next; // 链表中的下一个节点
HashMapEntry(this.key, this.value, this.hashCode, this.next);
}