从源码来理解HashMap和HashSet

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值