HashMap源码分析
一、简介 HashMap是基于哈希表实现的,因其实现了Serializable和Cloneable接口所以支持序列化和被克隆,其每一个元素都是一个唯一且允许key和value为null的key-value键值对,其内部通过单链表和红黑树(1.8中加入)解决冲突问题,容量不足(超过了阀值)时,会自动增长。其是非线程安全的,适用于单线程环境,多线程环境下可采用concurrent并发包下的concurrentHashMap。 数据结构如下: 二、源码分析 1. 成员变量 //默认初始容量(16),必须是2的幂。 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) static final int MAXIMUM_CAPACITY = 1 << 30; //默认装载因子(0.75),当实际元素所占容量占分配容量比例达到装载因子即75%时就要扩容了。填充比越大利用的空间很多,同时查找的效率也越低,因为链表的长度很大(1.8版本使用了红黑树后会改进些)。当我们关注内存时填充比可以稍大,当我们关注查找性能时填充比可以稍小些。 static final float _LOAD_FACTOR = 0.75f; //一个桶(bucket)即链表的树化阈值