精彩牛耳,用心缔造

集合框架之HashMap底层实现原理

作者: 编辑: 来源: 发布日期: 2019.01.03
信息摘要:
Java中集合的根接口是Collectio,Collectio表示一组对象,这些对象也称为Collectio元素,一些collectio允许…

Java中集合的根接口是Collection,Collection表示一组对象,这些对象也称为Collection元素,一些collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如Set 和List)实现。此接口通常用来传递collection,并在需要最大普遍性的地方操作这些 collection,还有一种集合接口Map,以键值对的方式保存在集合中,Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如TreeMap 类;另一些映射实现则不保证顺序,如HashMap 类.


1.什么是HashMap?

HashMap是基于哈希表的map接口实现.此实现提供所有可选的映射操作,并允许使用null 值和null 键。(除了非同步和允许使用null 之外,HashMap 类与Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变.


2.HashMap实现原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象.


3.HashMap的初始化

HashMap初始容量是16,可以对其进行扩容,扩容的公式是:newsize = oldsize*2,size一定为2的n次幂,而且扩容是针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入,插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀.计算index方法:index = hash & (tab.length – 1)


HashMap的初始值还要考虑加载因子:

·  哈希冲突:若干Key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对Key的查找需要遍历Entry链上的每个元素执行equals()比较。

· 加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是100,即需要设定100/0.75=134的数组大小。

· 空间换时间:如果希望加快Key查找的时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突的概率。


4.HashMap应该注意的点:

a.  HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

b.  在HashMap中,null可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个key,应该用containsKey()方法来判断。而在Hashtable中,无论是key还是value都不能为null。


5.HashMap实际应用案例:

【相关推荐】
牛耳推荐资讯
IT学子们请像高考冲刺那样,圆我们的IT梦

IT学子们请像高考冲刺那样,圆我们的IT梦

还记得当年高考前教室后面的标语吗?还记得模拟考成绩出来后的悲与欢吗?还记得那最后100天我们内心的充实吗?然而随着大学生活的流式,那些埋藏在我们内心深处的美好记忆也随之消逝。各位IT专业的学子们,你们是否也是满怀期待的选择计算机专业,是否也是因为学电脑很有前途,因为现在IT行业发展火爆?确实T行业需要......
2020-01-06
长沙IT培训---计算机系实习的我们该何去何从

长沙IT培训---计算机系实习的我们该何去何从

又是一年实习季,到了这个时候就想起了当年的小编自己,没有其他词语比迷茫着两个字更加能代表自己的心情了。随着互联网经济的不断发展,IT技术也随之不断的更新、更迭,IT行业俨然成为了21世纪最火的行业之一。但是不是学计算机的人又哪懂我们计算机系的苦呢?从入学到毕业我们大大小小有七八个方向可以选择,有时候......
2020-01-06
长沙IT培训---其实转行就那么简单

长沙IT培训---其实转行就那么简单

最近我看到了一篇文章,文章的内容是关于华为公司大规模裁员的,大概的意是说,华为公司宁愿冒着赔偿10亿的风险,也要开除公司内部的7000多名“闲职”人员。看了这篇文章之后,我的感受颇深,文章有一句话很犀利:“时代抛弃你,从来都不会打招呼”,我觉得我需要正视下自己了,觉得必须要保持持续学习的习惯,否则说......
2020-01-06

咨询热线

400-0731-162
  
    • *

    • *