map的数据结构,扩容机制,key是无序的原因

map就相当于是一个超级查询表,给它一个Key,它可以给你返回对应的value。例如

Go 复制代码
m := map[string]int{
    "apple":  3,
    "banana": 5,
}
fmt.Println(m["apple"]) // 3

以上例子,Apple就是Key,3就是代表的value。

原理分析:

(1)哈希表:Go中的map实现基于哈希表。哈希表是一种数据结构,通过哈希函数将键映射到存储桶(bucket)中,哈希表的主要优点是可以在平均时间复杂度为 O(1) 的时间内实现快速的查找、插入和删除操作。

(2)哈希函数:哈希函数将键映射为唯一的哈希值。在Go中,哈希函数会将键的二进制表示转换成一个固定长度的哈希值。这个哈希值会被映射到哈希表中的一个桶中。

(3)桶(bucket):哈希表由多个桶组成,每个桶存储具有相同哈希值的键值对。当发生哈希冲突时,即多个键映射到同一个桶中,通常使用链表或者其他数据结构来存储这些键值对,以实现冲突的解决。

(4)动态扩容:为了避免哈希表中桶的过度填充,Go 中的map实现会在适当的时候自动进行动态扩容。当map中的键值对数量达到一定阈值时,Go 会创建一个新的更大的哈希表,并重新哈希所有的键值对到新的桶中。

(5)哈希冲突处理:哈希冲突是指不同的键映射到相同的哈希值的情况。在哈希表中,通常使用链表或其他方式来解决哈希冲突。当插入新的键值对时,如果发生了哈希冲突,新的键值对会被添加到对应桶的链表中。

Go 复制代码
package main

import (
	"fmt"
	"sync"
)

func main() {
	// 创建一个线程安全的 map
	var myMap sync.Map

	// 使用 Store 方法向 map 中存储键值对
	myMap.Store("apple", 10)
	myMap.Store("banana", 20)
	myMap.Store("orange", 30)

	// 使用 Load 方法从 map 中加载值
	value, exists := myMap.Load("banana")
	if exists {
		fmt.Println("Value of banana:", value)
	}

	// 使用 Delete 方法从 map 中删除键值对
	myMap.Delete("banana")

	// 使用 Range 方法遍历 map 中的所有键值对
	myMap.Range(func(key, value interface{}) bool {
		fmt.Println("Key:", key, "Value:", value)
		return true
	})
}
相关推荐
晊晌_h3 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦4 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
lisin-lee-cooper9 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-10 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
Data_Journal10 小时前
Scrapyd:分步教程
开发语言·python·microsoft·golang·编辑器·html·iphone
哭泣方源炼蛊11 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
五_谷_丰_登12 小时前
平衡二叉树(AVL)讲解二
数据结构·c++
程序员小八77713 小时前
Go Web 工程化:日志、配置与错误处理中间件,让服务「能上线」
前端·中间件·golang
fpcc14 小时前
数据结构和算法—最短路径的算法
数据结构·算法
zzzll111114 小时前
深入理解 Java HashMap:从原理到实战
java·开发语言·哈希算法