HashMap底层原理详解
1. 说明
- Map接口的常用实现类:HashMap, HashTable和Properties
- HashMap是Map接口使用频率最高的实现类
- HashMap是以key - value对的方式来存储数据的(HashMap$Node类型)
- key不能重复,但是值可以重复,允许使用null键和null值
- 如果添加相同的key,则会覆盖原来的key - value,等同于修改(key不会替换,value会替换)
- 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式存储的
- HashMap没有实现同步,因此是线程不安全的,方法也没有做同步互斥的操作,没有synchronized
2. 底层原理详解
- key - value是一个node,实现了Map.Entry<K,V>
扩容机制
- HashMap底层维护了Node类型的数组table,默认为null
- 当创建对象时,将加载因子(loadfactor)初始化为0.75
- 当添加k - v时,通过key的哈希值得到在table的索引,然后判断该索引处是否有元素,如果没有元素直接添加,如果该索引处有元素,继续判断该元素的key和准备加入的key是否相等,如果相等,则直接替换val,如果不相等需要判断是树结构还是链表结构,做出相应处理,如果添加时发现容量不够,需要扩容
- 第一次添加,则需要扩容table容量为16,临界值(threshold)为12(16*0.75)
- 以后再扩容,则需要扩容table容量为原来的2倍,临界值也为原来的2倍,以此类推
- 再Java8及以后,如果一条链表的元素个数超过8,并且table的大小>=64,j就会进行树化(红黑树)
HashMap底层原理详解
原文:https://www.cnblogs.com/mx-info/p/14744368.html