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

从源码来理解HashMap和HashSet

时间:2015-08-09 10:54:47      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:hashmap   hashset   java   

HashMap

HashMap 内有一个table数组存放<K,V>,用关键字transient,则说明HashMaptable数组值是存放在内存中,不作为序列化数据保存。

技术分享

put函数

技术分享

如果key==null

技术分享

注意:table是一个数组,而这个数组下每个元素的下面其实是个链表,都是通过hashkey)得到相同k位置(table[k])

空值统一放在table0位置,先遍历table[0]下的所有元素,如果插入的key==null,则将原本Entryvalue替换,返回之前的值(oldValue)。

如果key!=null

技术分享

根据key求出hash值,然后再让hashtable.length做相与运算,求得i0-table.length-1中,然后根据i的位置,遍历table[i]下的链表,如果其下的元素key值与插入的key值相等的话则把原来key所对应的value值改成插入的value值,返回oldValue,如果旗下的元素key值遍历循环都没有与之相等,则添加一个Entry(addEntry(hash,key,value,i)).

技术分享

技术分享

技术分享

table[bucketIndex]中存放新的Entry对象,对象的next值存放原来的table[bucketIndex]对象,链表长度增加。

remove函数

技术分享


技术分享

如果key==nullhash0(固定的,前面有说),否则就根据key求得hash值,然后相与运算得到iprevtable[i]对象,遍历table[i]下的链表,判断如果key相等的话,如果它是首(也就是说table[i]------(pre == v)的情况),则让table[i]=next,如果它不是首else prev.next = next,直接连接下个元素,跳过中间元素,相当于删除(Javagc机制,如果没有对象引用它的话,则会被回收掉),返回删除掉的e。循环结束后如果找不到找不到则返回null

HashSet

HashSet本质是用HashMap来实现功能的。

技术分享

技术分享

PRESENT是随便new出来的Object,是一个final值,也就是说add加进去的每个Value都是一样的。

技术分享

put函数又调用到前面所讲的HashMap里的put内,都是一样的

技术分享

如果成功添加成功(addEntry后)则返回null,则add函数返回true,表示HashSet添加元素成功。

remove函数

技术分享

本质也是调用HashMapremove函数,

技术分享

如果HashMap中有这个key的话则返回这个key对应的value,如果没有则返回null.

版权声明:本文为博主原创文章,未经博主允许不得转载。

从源码来理解HashMap和HashSet

标签:hashmap   hashset   java   

原文地址:http://blog.csdn.net/u012432475/article/details/47373109

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