HashMap底层原理详解

HashMap底层原理详解

1. 说明

  1. Map接口的常用实现类:HashMap, HashTable和Properties
  2. HashMap是Map接口使用频率最高的实现类
  3. HashMap是以key - value对的方式来存储数据的(HashMap$Node类型)
  4. key不能重复,但是值可以重复,允许使用null键和null值
  5. 如果添加相同的key,则会覆盖原来的key - value,等同于修改(key不会替换,value会替换)
  6. 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式存储的
  7. HashMap没有实现同步,因此是线程不安全的,方法也没有做同步互斥的操作,没有synchronized

2. 底层原理详解

  • key - value是一个node,实现了Map.Entry<K,V>
扩容机制
  1. HashMap底层维护了Node类型的数组table,默认为null
  2. 当创建对象时,将加载因子(loadfactor)初始化为0.75
  3. 当添加k - v时,通过key的哈希值得到在table的索引,然后判断该索引处是否有元素,如果没有元素直接添加,如果该索引处有元素,继续判断该元素的key和准备加入的key是否相等,如果相等,则直接替换val,如果不相等需要判断是树结构还是链表结构,做出相应处理,如果添加时发现容量不够,需要扩容
  4. 第一次添加,则需要扩容table容量为16,临界值(threshold)为12(16*0.75)
  5. 以后再扩容,则需要扩容table容量为原来的2倍,临界值也为原来的2倍,以此类推
  6. 再Java8及以后,如果一条链表的元素个数超过8,并且table的大小>=64,j就会进行树化(红黑树)
posted @ 2021-05-08 11:53  mx_info  阅读(253)  评论(0)    收藏  举报