HashMap底层
Posted 12aa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap底层相关的知识,希望对你有一定的参考价值。
创建一个新的HashMap集合
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
//默认的负载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f; //表示当map集合中存储的数据达到当前数组大小的75%则需要进行扩容
//如果初始容量 小于0 则抛异常
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
//超过了最大值,则取最大值
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
//初始因子为小于等于0,或者不存在则抛异常
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
threshold = initialCapacity;
init();
}
public HashMap(int initialCapacity) {
//调用构造函数 1
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap() {
//调用构造函数 1
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}
二叉查找树
左子树上所有的节点的值都小于等于他根节点的值
右子树上所有的节点的值都大于等于他根节点的值
9根节小于10查到了右边13
10小于13查到了左11
10小于11就做11的左节点,12大于11作为11的右节点,然后最大的15作为13右节点
红黑树
红黑树是一个平衡的二叉树
节点是红色或是黑色
根节点是黑色的
每个叶子节点都是黑色的空节点
每个红色的两个字节点都是黑色
从任意节点到齐每个叶子节点的所有路径都包含相同黑色节点。
插入和删除节点,就会对平衡造成破坏,需要对树进行调整重新保持平衡
hash碰撞
两个输入串的hash函数的值一样,这两个串是一个碰撞。既然是把任意长度的字符串变成固定长度的字符串,会有一个输出串对应无穷多个输入串,碰撞是存在的。
hash函数 f 应当满足以下三个条件:
对于任意y,寻找x,使得f(x)=y,在计算上是不可行的。
给定x1∈A,找x2∈B,,使得f(x1)=f(x2),在计算上是不可能的,这也就是弱无碰撞性。
寻找x1,x2,使得f(x1)=f(x2),在计算上也是不可行的,这也就是强无碰撞性。
碰撞处理
通常有两类方法处理碰撞:开放寻址(Open Addressing)法和链接(Chaining)法。前者是将所有结点均存放在散列表T[0..m-1]中;后者通常是把散列到同一槽中的所有元素放在一个链表中,而将此链表的头指针放在散列表T[0..m-1]中。
再哈希法
再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,....,等哈希函数
计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。
以上是关于HashMap底层的主要内容,如果未能解决你的问题,请参考以下文章
HashMap的底层实现原理? HashMap 和 Hashtable的异同? 负载因子值的大小,对HashMap有什么影响?