自定义数据结构—MyHashMap

[size=medium]在学习了数据结构HashMap之后,自己也定义了一个MyHashMap,下面来解析一下MyHashMap。[/size]
[size=x-large]1、实质为一个数组[/size]
[size=medium]我定义的MyHashMap中所使用的数据结构是一个数组,数据都存储在这个数组中。当然你肯定有疑问,若是用这个数组的话那得要多大的数组才能放下那么大的数据?别急,在下面的内容中我会来解答,o(∩_∩)o ~~[/size]
[size=x-large]2、Hash函数[/size]
[size=medium] 作为一种数据结构,那必然是要有存储数据的方法即我自己定义的put方法,它的作用就是根据传入的key将value放在指定的位置,那怎样才能将value放在指定位置呢?这还不简单?数组的下标不就可以作为key,这样不就确定了位置了嘛,用这样的方法处理少量数据或许还可以,但是若处理大批量的数据,那么它的作用那就捉襟见肘了。所以这里需要用到Hash函数,它的作用就是经过一定的计算确定数据存储的位置,我定义的Hash函数是根据key对象的hashcode值然后与数组的长度取余,这样就确定了数据要放在数组的什么位置了,这样定义的数组的长度就可以很小了。但是又生出一个疑问,取余的话必然会有相同的余数,那么怎样存储这两个或多个在数组上位置相同的数据呢?[/size]
[size=x-large] 3、链表数组[/size]
[size=medium]既然有多个数据在同一位置上,那么将他们放入另一个容器中,而数组中存储的是这个容器,那么问题就解决了,在MyHashMap中使用的容器是链表,每当有一个数据存进来时,若对应的位置上没有数据,则新建一个结点,将数据存储进去,将结点存储在数组该位置上;若对应的位置上已有数据,则新建一个结点,将数据存储进去,并将该结点作为链表的尾结点。这里也有一个问题,大家都知道一个小链表的查找效率还行,但是一个大链表的查找效率是很低的,随着存储的数据的增加,那必然导致链表变大,那如何才能使其效率不是很低呢?[/size]
[size=x-large]4、装载因子与rehash[/size]
[size=medium]要解决上面的问题需要用到装载因子与rehash,那么什么叫做装载因子与rehash呢?装载因子就是一个限制,它决定了这个数组中能存储多少数据,若是超过这个限制,那么就需要rehash了,在MyHashMap中,设置装载因子为0.7。rehash是对超过装载因子后的Hashmap进行的处理,在MyHashMap中的rehash为新建一个长度为原长度的两倍的数组,并将原数组中的数据重新经过hash函数计算,存储进新的数组中。其实这里也体现了MyHashMap的弊端,大数据转移时这个操作的效率很低。[/size]
[size=x-large]5、总结[/size]
[size=medium]MyhashMap实质为一个链表数组,根据hash函数来存储数据,根据装载因子来确定是否要进行rehash。而弊端则是在将原数组数据转移到新数组时的效率低。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值