HashMap类
HashMap 内有一个table数组存放<K,V>,用关键字transient,则说明HashMap的table数组值是存放在内存中,不作为序列化数据保存。
put函数
如果key==null,
注意:table是一个数组,而这个数组下每个元素的下面其实是个链表,都是通过hash(key)得到相同k位置(table[k])
空值统一放在table的0位置,先遍历table[0]下的所有元素,如果插入的key==null,则将原本Entry的value替换,返回之前的值(oldValue)。
如果key!=null
根据key求出hash值,然后再让hash与table.length做相与运算,求得i在0-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==null,hash为0(固定的,前面有说),否则就根据key求得hash值,然后相与运算得到i,prev为table[i]对象,遍历table[i]下的链表,判断如果key相等的话,如果它是首(也就是说table[i]------(pre == v)的情况),则让table[i]=next,如果它不是首else prev.next = next,直接连接下个元素,跳过中间元素,相当于删除(Java的gc机制,如果没有对象引用它的话,则会被回收掉),返回删除掉的e。循环结束后如果找不到找不到则返回null。
HashSet
HashSet本质是用HashMap来实现功能的。
PRESENT是随便new出来的Object,是一个final值,也就是说add加进去的每个Value都是一样的。
put函数又调用到前面所讲的HashMap里的put内,都是一样的
如果成功添加成功(addEntry后)则返回null,则add函数返回true,表示HashSet添加元素成功。
remove函数
本质也是调用HashMap的remove函数,
如果HashMap中有这个key的话则返回这个key对应的value,如果没有则返回null.
版权声明:本文为博主原创文章,未经博主允许不得转载。