码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap详解

时间:2016-04-03 18:47:17      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

2016-04-03   16:38:17

转载请注明出处:http://www.cnblogs.com/kuihuazi/p/5350100.html

总述:下面讲解分为两个部分:hashmap的构建,HashMap的使用。

1.HashMap的构建

  如何构建HashMap?构建HashMap的过程中都做了什么?

  构造方法:HashMap(),HashMap(capacity),HashMap(capacity,loadFactor).前两个构造方法会转为对第三个构造方法的调用,capacity是容量,也就是数组的长度,loadFactor是装载因子,capacity*loadFactor的值是触发HashMap()进行扩容的最低键值对个数。

技术分享

  构造方法--- HashMap(capacity,loadFactor)都做了些什么那???见下面。

技术分享

  HashMap(capacity,loadFactor)只做了两件事:确定threshold,构建HashMap的存储结构---链表数组。

 

2. HashMap的使用:get(key),put(key,value).

1).get(key).

技术分享

HashMap会将key=null的键值对存入第一条链表也就是索引为0的链表中。

技术分享

技术分享

取余数的巧妙之处:

因为HashMap的容量是2的幂数,所以hash(key)%capacity=hash(key) & (capacity - 1):

技术分享

通过位移和异或来计算hash值。

技术分享

 

2).put(key,value)

  put(key,value)操作,当HashMap中已经存在键值=key的键值对,则用新value覆盖旧value,并返回旧值。若不存在,则将(key,value)插入链表的头部。

技术分享

当key=null时:

技术分享

添加(key,value)之前,要判断是否会触发扩容,扩容条件:当前HashMap中的键值对个数size是否已达到最低值threshold,要插入的那条链表是否已有键值对。技术分享

将新建节点插入链表头部。插入头部可以避免尾部遍历所带来的时间损耗。

技术分享

 

HashMap详解

标签:

原文地址:http://www.cnblogs.com/kuihuazi/p/5350100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!