目录
一.哈希值
Object父类为我们提供了计算哈希值的方法,源码如下:
native关键字修饰的方法没有方法体,会去调用底层库来实现功能。
哈希值的计算利用的内存地址。
如果我们想要实现自定义的哈希值算法可以通过覆盖重写Object的hashCode方法
二.哈希表的结构
哈希表由数组+链表或者数组+链表+红黑树组成
这张图片是数组加链表的形式,如果想要引入红黑树的结构,我们就必须要了解到哈希表的扩容条件:
什么时候数组长度会扩容:
1.当某一索引值位置的元素个数超过8个并且数组长度小于64时
2.数组每个位置占有率达到加载因子时数组会扩容
加载因子默认值为75%,我们可以通过有参构造的形式改变加载因子,
initialCapacity值用于直接确定数组长度,实际长度>=传入长度最近的2的次方的值
loadFactor值就是加载因子,我们可以自己定义
情况实列:如果某一位置的元素个数大于八个且数组长度小于64时,此时数组会扩容
什么情况下链表会转红黑树:
当同意索引值位置下元素个数>8并且数组长度>=64时
情况实列:如果某一位置的元素个数大于八个且数组长度大于等于64时
三.哈希表的优点
哈希表的优点就是能够同时兼具快速的查询数据,增删数据的能力
其原因就是不论怎么添加数据,整个数据结构的纵深长度不会太大
四.哈希表不允许存储重复元素的原理
我们需要知道哈希表增加元素的原理:
1.计算要添加元素对象的哈希值
(如果该元素对象的类型没有重写Object类中的HashCode()方法则默认用地址值计算)
2.求出该哈希值要存放元素的对应数组索引位置
3.判断该位置是否有元素
(1)如果该位置有元素,则比较元素是否相同
若不同则直接新增在该位置链表的最后
若相同则不新增
(2)如果该位置没有元素则直接新增
判断元素是否相同的方式
哈希值是否相同&&( 地址值是否相同 || equals是否相同 )