【源码阅读】HashMap

版权声明: https://blog.csdn.net/qq_21852449/article/details/85240801
  1. 数据结构
    JDK1.8对HashMap进行了比较大的优化,底层由以前的数组+链表变成了数组+链表+红黑树的实现形式,当链接结点较少时用链表,当链接结点超过一定值的时候用红黑树。在这里插入图片描述
  2. 继承实现
    在这里插入图片描述
  3. 属性
	//缺省容量
    static final int DEFAULT_INITIAL_CAPACITY = 16;
    //最大容量
    static final int MAXIMUM_CAPACITY = 1073741824;
    //缺省加载因子
    static final float DEFAULT_LOAD_FACTOR = 0.75F;
    //链表转化为红黑树的阀值
    static final int TREEIFY_THRESHOLD = 8;
    //存放元素的实际数组
    transient HashMap.Node<K, V>[] table;
    transient Set<Entry<K, V>> entrySet;
    //实际存储的key-value数量
    transient int size;
    //修改次数
    transient int modCount;
    //[略]扩容参考值
    int threshold;
    //负载因子
    final float loadFactor;
  1. 构造方法
/**
initialCapacity:默认大小16
loadFactor:默认0.75
*/
public HashMap(int var1){...}
public HashMap() {...}
public HashMap(Map<? extends K, ? extends V> var1) {...}
public HashMap(int initialCapacity, float loadFactor){...}
  1. 核心方法
public V put(K var1, V var2) {...}
public Set<K> keySet() {...}
public V replace(K var1, V var2) {...}
  1. 总结
    1.HashMap结合了数组和链表的优点,使用Hash算法加快访问速度,使用散列表解决碰撞冲突的问题,其中数组的每个元素是单链表的头结点,链表是用来解决冲突的
    2.HashMap有两个重要的参数:初始容量和加载因子。这两个参数极大的影响了HashMap的性能。初始容量是hash数组的长度,当前加载因子=当前hash数组元素/hash数组长度,最大加载因子为最大能容纳的数组元素个数(默认最大加载因子为0.75),当hash数组中的元素个数超出了最大加载因子和容量的乘积时,要对hashMap进行扩容,扩容过程存在于hashmap的put方法中,扩容过程始终以2次方增长。
    3.HashMap是泛型类,key和value可以为任何类型,包括null类型。key为null的键值对永远都放在以table[0]为头结点的链表中,当然不一定是存放在头结点table[0]中。

猜你喜欢

转载自blog.csdn.net/qq_21852449/article/details/85240801