您的位置:首页 > 移动开发 > Android开发

HashMap类的理解

2015-07-02 17:31 561 查看
HashMap是一个散列表,它的存储内容是键值对。

 


紫色部分代表哈希表,每个元素后面都是一个单链表的头结点。

源码分析:

 





上面源码,

hashMap初始容量为4个,最大容量为2的30次幂,增长因子为0.75,在进行扩容时,扩容数量=增长因子*当前容量。第90行,为对应的hash表

 


HashMapEntry对已的结构:

Put

 






1.当key为null时,在414行先检测entryForNullKey是否为空

 1.1 如果不为空,在422行直接更新entryForNullKey的value,并返回对应的HashMapEntry。 

 1.2 如果为空,在415行和485行出,new 一个HashMapEntry,然后赋给entryForNullKey。

备注:key为null的时候,entryForNullKey是作为hashMap的一个变量,存储key为null的HashEntry的,并没有将key为null并入哈希表中

2.当key不为null时,通过key的hashcode找到哈希表中的index,然后遍历index位置下的链表,通过394行的比较(通过hashcode和key的equals共同确认是否是需要找的entry)

 2.1 如果找到,直接替换value

 2.2 如果未找到

  2.2.1 在404行,比较是否需要扩容,下面是扩容的方法:在574行,扩容时以当前容量的2倍进行扩容的。

 


  2.2.2 然后通过addNewEntry方法,将新的entry加入到里面去。

  2.2.3 在addNewEntry中,即476行,直接是table[index]=new HashMapEntry,由此可见,每次put的Entry都在链头。

 

Remove

 




 

1.当key==null时,若entryForNullKey!=null,则直接将entryForNullKey=null。

2.当key!=null时,寻找entry的方式和put一样,最终通过比对hashcode以及equals比较,确认需要remove的entry。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android java