JDK源码分析 – HashMap

 

HashMap类的申明

HashMap的定义如下:

复制代码
1 public class HashMap<K,V> extends AbstractMap<K,V>2     implements Map<K,V>, Cloneable, Serializable {}
复制代码

HashMap是一个散列表,用于存储key-value形式的键值对。

从源码的定义中可以看到HashMap继承了AbstractMap抽象类而且也实现了Map<K,V>接口,AbstractMap类本身也继承了Map<K,V>接口,Map接口定义了一些map数据结构的基本操作, AbstractMap提供了Map接口的一些默认实现。

HashMap实现了Cloneable接口和Serializable接口,这两个接口本身并没有定义方法,属于申明式接口,允许hashmap进行克隆和序列化。

另外,HashMap不是线程安全的,如果需要使用线程安全的HashMap,可以使用Collections类中的synchronizedMap方法来获得线程安全的HashMap:

Map map = Collections.synchronizedMap(new HashMap());

HashMap主要字段属性说明

复制代码
 1 //hashmap的初始容量:16 2 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16  3  4 //hashmap的最大容量,hashmap的容量必须是2的指数值 5 static final int MAXIMUM_CAPACITY = 1 << 30;  6  7 //默认填充因子 8 static final float DEFAULT_LOAD_FACTOR = 0.75f;  9 10 //链表转换为树的阀值:如果一个桶中的元素个数超过 TREEIFY_THRESHOLD=8 ,就使用红黑树来替换链表,从而提高速度11 static final int TREEIFY_THRESHOLD = 8; 12 13 //树还原为链表的阈值:扩容时桶中元素小于UNTREEIFY_THRESHOLD = 6,则把树形的桶元素还原为链表结构14 static final int UNTREEIFY_THRESHOLD = 6; 15 16 //哈希表的最小树形化容量:当哈希表中的容量大于这个值MIN_TREEIFY_CAPACITY = 64时,哈希表中的桶才能进行树形化,否则桶中元素过多时只会扩容,并不会进行树形化, 为了避免扩容和树形化选择的冲突,这个值不能小于4* TREEIFY_THRESHOLD = 3217 static final int MIN_TREEIFY_CAPACITY = 64; 18 19 //hashmap用于存储数据的Node数组,长度是2的指数值20 transient Node<K,V>[] table; 21 22 //保存entrySet返回的结果23 transient Set<Map.Entry<K,V>> entrySet; 24 25 //hashmap中键值对个数26 transient int size; 27 28 //hashmap对象修改计数器29 transient int
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信