HashMap源码窥探(jdk 7)

一、在实际开发中,使用hashMap的场景较多,也需要了解底层的实现,能更好的使用它,个人理解,如有不妥,望指正。

二、HashMap的数据结构
这里写图片描述
HashMap的数据结构是一个数组,数组中存储的是entry,而entry是一个单向的链表结构,entry中的元素包括(key,value,hsah,entry),entry代表的是下一个entry。为什么会采用这种结构?个人理解是HashMap使用了链地址法处理哈希冲突,当table[i]已有元素,并且待存储的key(记为k1)的hash与table[i]中的key(记为k2)的hash相同,即k1与k2为同义词时,就把它记录在同一线性表中。bucket译为”桶”,每个“桶”中有一个或多个entry。

三、hashMap的注释说明
它允许存储key为null或value为null的映射,大致相当于HashTable,但是hashTable是线程同步的,并且不允许存储null值。hashMap不保证存储的有序,并且也不保证在一段时间内存储的顺序不变。
影响其性能的有两个重要的参数:初始容量(initial capacity)和负载因子(load factor)。
容量是hash table中桶的数量,初始容量是创建hash table时的容量。负载因子是在hash table的容量自动增加(发生重哈希)之前,hash table被允许达到的最大容量的度量(capacity * load factor),如果初始容量大于条目的最大数量除以负载因子,就不会发生重哈希操作。
hash table的大小必须是2的幂次方。
四、hashMap
1 常量

DEFAULT_INITIAL_CAPACITY = 16 // 默认初始容量

MAXIMUM_CAPACITY =  Integer.MAX_VALUE //最大容量 2的31次方

DEFAULT_LOAD_FACTOR = 0.75f //默认负载因子

2 变量

Entry<K,V>[] table //Entry类型的数组,HashMap用这个来维护内部的数据结构,它的长度由容量决定

int threshold //阀值:扩容临界点(容量和加载因子的乘积)

int modCount //结构修改次数,用于迭代时快速失败

详细内容查看:
https://www.cnblogs.com/dijia478/p/8006713.html(jdk 1.7)
http://www.cnblogs.com/skywang12345/p/3310835.html#b2

猜你喜欢

转载自blog.csdn.net/weixin_37885641/article/details/82082525
今日推荐