注意:Map和Set不能通过下标访问数据,因为集合里面元素无序。所以遍历Map和Set中的数据一般使用for of或者forEach方法。
1.哈希表
参考链接
哈希表概述:
散列表(Hash table,也叫哈希表),是根据关键值(Key)而直接进行访问的数据结构。也就是说,它通过把关键值key映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数(哈希函数),存放记录的数组叫做散列表。(哈希表一般用数组来存储)
向哈希表中存数据:
根据数据的key值和哈希函数,得到一个数组下标,这个下标的含义是数据在哈希表中的存放的位置。若发生了冲突,则再根据冲突的处理方法来解决冲突。找到最终存放的位置后,将数据存放进去。
在哈希表中查找数据:
根据数据的key值和哈希函数,以及解决冲突的方法来找。
所以哈希表查询某个数据的时间复杂度为o(1)
哈希函数的设计方法有:
.直接寻址法、
解决冲突的方法有:
开放寻址法(包括线性探测法,平方探测法,双哈希)、再散列法、 链地址法
2.java中hashmap和map关系(注意是java中)
Map是存储键和值这样的键值对的数据的集合,但存储的数据是没有顺序的,其键不能重复,但其值是可以重复的。Map是一个接口,HashMap是实现了Map接口的类;
HashMap是基于哈希表实现的,每一个元素是一个key-value键值对。
对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对。
3.js中Map
js中只有Map,没有HashMap。
从上面分析java中的HashMap可以发现,HashMap只是map的一种底层实现方式。所以在js里,用原生的map就够用了(刷题够了)
https://es6.ruanyifeng.com/#docs/set-map
在引入Map之前,js中保存键值对是通过对象的形式,而对象中,键的类型只能是字符串类型。而引入Map后,用Map来存储键值对,键的类型可以是数字类型,可以是字符串类型,可以是对象类型,函数类型等等。
4.js中Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。
Set是一组key的集合,不存储value。由于key不能重复,所以,在Set中,没有重复的key。
Set是多用来操作数组的(比如数组去重,查找数组中是否存在某个元素,等等)
(1)初始化Set
(2)数组转Set以及Set转数组
(3)使用Set对数组元素进行去重
(4)使用Set查找数组中是否有某个元素
(5)遍历Set
(1) keys方法、values方法、entries方法返回的都是遍历器对象。由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
(2)forEach()
Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
forEach方法的参数就是一个处理函数。该函数的参数与数组的forEach一致,依次为键值value、键名key、集合本身(上例省略了该参数)。这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。
(6)使用Set对两数组求并集,交集,差集