网站首页 > java教程 正文
概述
map是常见的一种数据结构,大部分编程语言都有,用于存储一系列无序的键值对,map也被称为字典或关联数组,顾名思义,键相当于索引,通过键与值形成映射关系,达到快速查找数据的目的。
声明和初始化
var map[Key-Type]Value-Type
首先我们看看声明map的格式,Key-Type表示的是key的类型,一定要是comparable的,即是可以任意用==或者!=比较的类型,比如float、int、string、bool。切片,结构体,map是不能作为key的,但是指针和接口类型是允许的。
value是可以支持任意的类型,甚至是内置的map。
比如声明一个key为string类型,value为int类型的map:
var mapScore map[string]int
在未初始化之前,map为nil,所以要进行初始化。
常用的初始化有make和花括号的形式2种方式:
方式一:
mapScore = make(map[string]int)
方式二:
//初始化空的map
m = map[string]int{}
//初始化不为空的map
mapScore :=map[string]int{
"Tom":78,
"Mary":60,
"Kevin":90,
}
在初始化的时候,可以无需知道map的长度,map是会动态的扩容的。
取值
score,exist := mapScore["Tom"]
if exist{
fmt.Println("Name:Tom,Score:",score)
}
map取值会返回两个形参,第一个是根据value的类型,返回缺省值,第二个是bool类型,tue表示键值对存在,false表示不存在。
删除
delete(mapScore,"Tom")
遍历
for key, value := range mapScore {
fmt.Println("Key:", key, "Value:", value)
}
Key: Mary Value: 60
Key: Kevin Value: 90
Key: Tom Value: 78
从遍历的结果可以看出输出的顺序是无法保证的。
排序:将无序变有序
上面提到过map是无序的,那怎么把map变成有序的呢?下面例子可以介绍在使用中也可能常用到的配合有序的切片slice将无序变成有序的过程。 比如需要按名字的英文字母排序输出:
func main(){
var names []string
mapScore :=map[string]int{
"Tom":78,
"Mary":60,
"Kevin":90,
}
for key, _ := range mapScore {
names = append(names,key)
}
sort.Strings(names)
for _,name:=range names{
fmt.Println("Key:", name, "Value:", mapScore[name])
}
}
Key: Kevin Value: 90
Key: Mary Value: 60
Key: Tom Value: 78
函数传递:引用类型
func main(){
mapScore :=map[string]int{
"Tom":78,
"Mary":60,
"Kevin":90,
}
fmt.Println(mapScore["Tom"])
modify(mapScore)
fmt.Println(mapScore["Tom"])
}
//修改
func modify(mapScore map[string]int){
mapScore["Tom"]=66
}
运行结果是可以看出key为"Tom"的值被修改了,说明map是引用类型。
线程安全:不安全
map不是线程安全的,在读写的时候,往往需要加锁:
type Accumulator struct{
sync.RWMutex
Accum map[string]int
}
读取数据时候,加上读锁
func (a *Accumulator)Read(i int){
a.RLock()
defer a.RUnlock()
count :=a.Accum["goodsView"]
fmt.Println("key:goodsView",count)
}
写数据时候,加上写锁
func (a *Accumulator)Write(i int){
a.Lock()
defer a.Unlock()
a.Accum["goodsView"]++
}
猜你喜欢
- 2025-08-02 Dart编程学习笔记05-列表与映射表
- 2025-08-02 深度解析 Java 21 新特性,助力互联网软件开发升级
- 2025-08-02 系统性能优化与Java代码编写性能考虑
- 2025-08-02 前端问答:Map 和 Object 有啥不同?
- 2025-08-02 36. JSON 解析速成,三库实战揭秘
- 2025-08-02 GitHub爆火!银四巨作:拼多多/蚂蚁/百度面经分享
- 2025-08-02 什么是unordered_map?用大白话说
- 2025-08-02 MapReduce过程详解及其性能优化(详细)
- 2025-08-02 轻松解读源码系列之Java集合接口&抽象类(1)—Map和Collection
你 发表评论:
欢迎- 08-02从上百个字段到1个CLOB:Oracle JSON存储实战指南
- 08-02什么是JSON?
- 08-02Qt解析JSON
- 08-02JSON是什么?JSON的使用详解
- 08-02mysql 之json字段详解(多层复杂检索)
- 08-02MySQL的json查询之json_array
- 08-02C#解析多层嵌套的JSON数组
- 08-02Dart编程学习笔记05-列表与映射表
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)