go map与哈希表的那些事——map底层数据结构(详细+图解)
在Go语言中,map是一种内置的数据类型,它可以存储无序的键值对。在底层,map的实现是基于哈希表的。哈希表是一种数据结构,可以通过键的哈希值来快速查找、插入和删除元素。
Go语言中的map实现具有以下特点:
- 键和值可以是任何类型,包括函数、接口等。
- 键必须是可以比较的,也就是说,键可以用
==
和!=
操作符进行比较。 - 值可以是任何类型,包括函数、接口等。
- 键值对是无序的。
- 使用
make
函数创建,如make(map[key_type]value_type)
。 - 使用
len
函数可以获取map的长度,即键值对的数量。 - 使用
delete
函数可以删除键值对,如delete(m, key)
。
哈希表的实现通常包括一个哈希函数、一个桶数组(bucket array)以及一个或多个链表。哈希函数将键映射到桶数组的索引上,同一个索引的所有键值对连接成一个链表。
下面是一个简单的示意图,展示了map的结构和查找过程:
哈希表结构示意图
+---------------------------------------+
| Bucket 0 | Bucket 1 | Bucket 2 | ... |
+---------------------------------------+
| | | |
| 链表 | 链表 | 链表 |
| | | |
+---------------------------------------+
假设我们有一个mapm := make(map[int]string)
,键类型为int
,值类型为string
。
- 当我们执行
m[1] = "one"
时,哈希函数计算1的哈希值,并将其映射到桶数组的某个索引上。 - 如果该索引处没有键值对,则直接将新的键值对插入该索引处。
- 如果该索引处已经有键值对,则会通过比较键的值来决定是替换现有的键值对,还是将新的键值对链在已有键值对之后。
- 查找时,同样通过哈希函数计算键的哈希值,并找到桶数组的索引。然后,遍历链表上的键值对,通过
==
操作符比较键,找到匹配的键值对。
这里的哈希表结构和过程就是map底层实现的基本概念和原理。
评论已关闭