哈希表是一种数据结构,它使用哈希函数组织数据,以支持快速插入和搜索。当我们插入一个新的键时,哈希函数将决定该键应该分配到存储位置,并将该键存储在相应的存储位置中
当我们想要搜索一个键时,哈希表将使用相同的哈希函数来查找存储位置,并只在存储位置中进行搜索。
数组:java.util.HashMap$Node(表示一个单向链表)
数组的长度:16
数组的扩容方式:新长度 = 旧长度<<1;
可以通过构造方法指定加载因子。加载因子(默认0.75)
可以通过构造方法指定哈希表数组的长度:
实际的长度>=传入容量,则最近2的次方的值。
判断新增的两个元素是否重复:
比较两个对象的哈希值&&(地址值相同||equales相同)
新增过程:
- 计算新增元素的哈希值
- (假设数组已经创建出来),通过哈希值%数组长度()
- 如果该位置为null:则直接新增
如果该位置不为null:
判断该元素是否重复
如果不重复:则新增到该索引值位置链表的最后
如果重复:则不新增
String覆盖重写了HashCode方法,只要内容相同,哈希值一定相同
什么情况下会扩容:
同一索引值下元素个数大于8,并且数组长度<64
数组的索引值,占有率达到0.75(默认值)
什么情况下会转红黑树:
同一索引值下元素个数大于8,并且数组长度>=64
只转该索引值下的链表结构
注意:同一索引值下元素不能超过8个,如果超过扩容,把元素分开,让其小于8个
或者同一索引值下元素个数大于8,并且数组长度>=64就会把链表结构转换成红黑树