map的使用注意事项
- map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取
 - map的长度是不固定的,也就是和slice一样,也是一种引用类型
 - 内置的len函数同样适用于map,返回map拥有的key的数量
 - map的值可以很方便的修改,通过numbers["one"]=11可以很容易的把key为one的字典值改为11
 - map和其他基本型别不同,它不是thread-safe,在多个go-routine存取时,必须使用mutex lock机制
 
最后一点需要注意: 字典不是线程安全的,在多个线程操作字典的时候,需要使用到互斥锁
判断map中是否含有某个key
v,ok:=map[key]
if ok{
}
map的查询效率(时间复杂度)(需要很懂数据结构,暂不深究)
golang中的map底层是hashMap数据结构,那么:
- 插入:O(1),最坏情况O(N)。
 - 查看:O(1),最坏情况O(N)。
 - 删除:O(1),最坏情况O(N)。
 
C++中的map采用的是红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:
- 插入: O(logN)
 - 查看:O(logN)
 - 删除:O(logN)
 
map与slice的速度比较
map的时间复杂度是O(1),slice的时间复杂度是O(n) 是不是map就一定比slice快呢?
var testTimeSlice=[]string{"aa","bb","cc","dd","ee","aa","zz"}
var testTimeMap = map[string]bool{"aa": true, "bb": true, "cc": true, "dd": true, "ee": true, "ff": true, "zz": true}
//以上为第一组查询测试数据
var testTimeSlice2=[] string{"aa","bb","cc","dd","ee","aa","aa","bb","cc","dd","ee","aa","aa","bb","cc","dd","ee","aa","aa","bb","cc","dd","ee","aa","i","j", "l", "m", "n", "o", "p", "q", "k", "x", "y", "z",
    "", "", "", "", "", "", "", "", "", "","zz"}
var testTimeMap2 = map[string]bool{"aa": true, "bb": true, "cc": true, "dd": true, "ee": true, "ff": true, "qq": true,"ww": true, "rr": true, "tt": true, "zz": true, "uu": true, "ii": true,"oo": true, "pp": true, "lk": true, "kl": true, "jk": true, "kj": true,"hl": true, "lh": true, "fg": true, "gfdd": true, "df": true, "fd": true,
    "i": true, "j": true, "l": true, "m": true, "n": true, "o": true, "p": true, "q": true, "k": true, "x": true, "y": true, "z": true,
    "": true, "": true, "": true, "": true, "": true, "": true, "": true, "": true, "": true, "": true}
//以上为第二组查询测试数据
func testSlice(a []string)  {
    now:=time.Now()
    for j:=; j < ; j++{
        for _,v:=range a{
            if v=="zz"{
                break
            }
        }
    }
    finish:=time.Since(now)
fmt.Println(finish1)
}
func testMap(a map[string]bool) {
    now:=time.Now()
    for j:=; j < ; j++{
        if _, ok := a["zz"]; ok {
            continue
        }
    }
    finish2:=time.Since(now)
    fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
    fmt.Println(finish2)
    fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
}
当用第一组测试数据时,结果如下:
.0011ms //Slice查询耗时
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.0038ms //Map查询耗时
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
用第二组测试数据时,结果如下:
.0038ms //Slice查询耗时
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.0019ms //Map查询耗时
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
现在可以得出结论了,当数据量小的时候,slice的查询速度是比map快的,为什么呢,因为golang的map底层是用hash实现的,既然有hash,那就要做映射,那就有hash函数,这个hash函数的开销千万不要忘记,不要一看到map就只记着O(1)
map的使用注意事项的更多相关文章
- Map接口使用注意事项
		
1,Map接口对象本身不能直接使用迭代进行输出的.因为map每个位置存放的是一对值. 而iterator每次只能找到一个值.如果一定要迭代输出,可以通过以下步骤.: 但是,Map接口只作为查找使用,输 ...
 - 【STL容器学习】-关联容器与map的用法
		
STL提供了4个关联容器:set.multiset.map和multimap.这些容器提供了通过keyword高速存储和訪问数据元素的能力.Set和map不同意有反复keyword,而multiset ...
 - 详解 Map集合
		
(请关注 本人"集合总集篇"博文--<详解 集合框架>) 首先,本人来讲解下 Map集合 的特点: Map集合 的特点: 特点: 通过 键 映射到 值的对象 一个 映射 ...
 - ajaxfileupload.js 文件上传
		
一,前台代码. <input id="fileToUpload" type="file" size="25" name="f ...
 - c++重要知识点
		
C++重要知识点精华总结 cin的使用: 1>cin>>a;键盘读入数据赋值给a; 1>程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将 ...
 - JAVA(四)类集/枚举
		
成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...
 - java实现微信扫一扫详解
		
java实现微信扫一扫详解 一.微信JS-SDK参数配置及查找 JS安全域名配置(查找:微信公众号里-公众号设置-功能设置页) 注:1.安全域名外网必须可以访问的到 2.域名不能有下划线 3.要将 ...
 - 百度地图API--百度地图底色选择
		
可选择底色列表<select id="stylelist" onchange="changeMapStyle(this.value)"> <o ...
 - day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数
		
20180729 补充部分代码 20180727 上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...
 
随机推荐
- Debug EOS:nodeos + mongo_db_plugin
			
上文书说到区块链的存储方式,并结合了EOSIO进行分析,其中也提到了使用CLion调试EOS的方法.本文将继续深入细致地展开对加载了mongo_db_plugin的nodeos的调试过程以及心得. 关 ...
 - 根域名服务器(root DNS Servers)会被DDoS打垮么?
			
域名服务作为互联网的基础设施,它的重要性不言而喻.目前全球的十三个根域名服务器和成千上万的授权域名服务器承担着超过万亿次的DNS查询,默默为全世界的网民做域名解析服务. 这样重要的基础设施,必然是全世 ...
 - 来自于一个问题的回答对自己的反思 php怎么发送邮件?发送邮件插件PHPMailer
			
前言: 昨天用手机无意点了一下博问,看见了一个朋友问了一个关于php发邮件不能添加发件人名称的问题,试着看了一下代码,觉得自己发现了问题所在,谁知道只是一知半解没有真正发现问题所在,看来有一段时间没有 ...
 - SSH原理和应用
			
SSH(Secure SHell)是为远程登录, 远程通信等设计的安全通信协议, 由芬兰研究员于1995年提出,其目的是用于替代非安全的Telnet.rsh.rexec等不安全的远程Shell协议. ...
 - Hyperledger Fabric密码模块系列之BCCSP(三)
			
fabric中通过工厂模式来生成bccsp实例,进而通过bccsp的接口来提供加密.解密.签名验证以及哈希等操作. fabric的factory工厂默认返回的bccsp实例是sw(也就是所有密码操作都 ...
 - Ajax之跨域请求
			
一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个inde ...
 - C# ListBox 自动滚动到底部 方法:
			
在ListBox中添加一条记录(ListBox.Items.Add方法)后,滚动条会自动回到顶部.我们可能更希望它自动滚动到底部,简要介绍几种方法. 方法一: this.listBox1.Items. ...
 - 【IDEA&&Eclipse】2、从Eclipse转移到IntelliJ IDEA一点心得
			
本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开始可能不适应,我就把使用过程中的一些经验和常用功能分享下,当然在看这篇之前推荐你 ...
 - Perfect hashing (And Minimal perfect hashing)
			
Perfect Hashing: A hash function that is injective-that is, maps each valid input to a different has ...
 - vue点击元素变色兄弟元素不变色
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...