概念:
map就是用于存储键值对(<key,value>)的集合类,也可以说是一组键值对的映射(数学概念)
有两个字段(或者说属性),keyset(键的集合)和values(值的集合),每一条记录都是一个entry(一个键值对)。
特点:
1、没有重复的key
(一方面,key用set保存,所以key必须是唯一,无序的;另一方面,map的取值基本上是通过key来获取value,如果有两个相同的key,计算机将不知道到底获取哪个对应值;这时候有可能会问,那为什么我编程时候可以用put()方法传入两个key值相同的键值对?那是因为源码中,传入key值相同的键值对,将作为覆盖处理)
2.每个 key 只能对应一个 value, 多个 key 可以对应一个 value
3.key,value 都可以是任何引用类型(包括 null)的数据
关于哈希:
1、把任意长度的输入,通过一种函数(hashCode() 方法),变换成固定长度的输出,该输出就是哈希值(hashCode),这种函数就叫做哈希函数,而计算哈希值的过程就叫做哈希。
2、将key通过哈希算法计算出哈希值,把哈希值作为数组下标,把该下标对应的位置作为键值对的存储位置,通过该方法建立的数组就叫做哈希表,而这个存储位置就叫做桶(bucket)。
3、数组是通过整数下标直接访问元素,哈希表是通过字符串key直接访问元素,也就说哈希表是一种特殊的数组(关联数组),哈希表广泛应用于实现数据的快速查找。
4、哈希表选用哈希函数计算哈希值时,可能不同的 key 会得到相同的结果,一个地址怎么存放多个数据呢?这就是哈希冲突(碰撞),决哈希冲突有两种方法,拉链法
性能选项(扩容机制)
哈希函数计算结果越分散均匀,哈希冲突的概率就越小,map的存取效率(时间复杂度)就会越高。
Hash表包含如下属性:
》容量(capacity):Hash表中桶的数量;
》初始化容量(initial capacity):创建Hash表时桶的数量;
》尺寸(size):当前Hash表中记录的数量;
》负载因子(load factor):负载因子 = size / capacity ,轻负载有冲突少、适宜插入与查询的特点;
》负载极限:在0~1之间,代表Hash表的填满程度,当负载因子达到负载极限时,Hash表会成倍的增加桶的数量,重新分配对象(rehashing),默认0.75
存储结构
Java中HashMap的实现原理
原文:https://www.cnblogs.com/zhongxiaoshu/p/11402438.html