HashMap集合介绍——哈希碰撞、成员变量initialCapacity

集合介绍

基本概念

HashMap集合介绍——哈希碰撞、成员变量initialCapacity_第1张图片

  • 链表结点长度大于8,数组长度大于64,会由链表转为红黑树。数组短的时候,查询效率会比较快,不需要加红黑树。因此链表长度大于8,首先会扩容到16—>32->64.

  • key、value可以为null,注意key只允许有一个null,因为它的数据结构是哈希表。

  • 存储键值对的过程:
    HashMap集合介绍——哈希碰撞、成员变量initialCapacity_第2张图片

  • 什么是哈希碰撞?如何解决?

  • 答:调用key的hashCode()方法得到的哈希值相同时,就会发生哈希碰撞;

    • 发生哈希碰撞后,在调用key的equals()方法,比较内容是否相同,相同,则覆盖对应的value,不同则与下面的链表进行比较;

    • jdk1.8之前采用链表解决哈希碰撞,1.8之后采用链表+红黑树解决。

  • 为什么引入红黑树?阈值为何是8
    待补充
    HashMap集合介绍——哈希碰撞、成员变量initialCapacity_第3张图片
    *

    • size表示HashMap中K-V的实时数量,并不等于数组长度。

    • threshold(临界值)=capacity(容量)*loadFactor(加载因子)。临界值表示当前已占用数组长度的最大值。size>threshold,就扩容到之前容量的两倍。

  • HashMap继承关系

    HashMap extends AbstractMap implements Map,Cloneable,Serializable

    AbstractMap implements Map

成员变量

1、序列化版本号

private static final long serialVersionUID = 362498820763181265L;

2、集合的初始化量(必须是2的n次幂)

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

为什么是2的n次幂?

答:使用hash&(length-1)这种方式计算索引;使数组内的数据分配均匀,减少哈希碰撞。

​ 如果数组长度不是2的n次幂,计算出的索引比较容易相同,导致发生hash碰撞,从而其余数组空间很大长度上并没有存储数据,链表或红黑树过长,效率低。

如果创建集合的initialCapacity不是2的n次幂,则会调用下面的方法找到最接近的大于initialCapacity的2次幂值

static final int tableSizeFor(int cap) {
    int n = cap-1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

HashMap集合介绍——哈希碰撞、成员变量initialCapacity_第4张图片

你可能感兴趣的:(HashMap集合介绍——哈希碰撞、成员变量initialCapacity)