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%则需要进行扩容
//构造函数 1public HashMap(int initialCapacity, float loadFactor) {
    //如果初始容量 小于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);
    this.loadFactor = loadFactor;
    threshold = initialCapacity;
    init();
}
//构造函数 2
public HashMap(int initialCapacity) {
    //调用构造函数 1
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
//构造函数 3
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函数,当发生冲突时,使用第二个,第三个,....,等哈希函数

    计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。

 

                                                    

 

posted on 2020-03-17 18:21  我胡闹i你善后i  阅读(130)  评论(0编辑  收藏  举报