`
Java.天道2011
  • 浏览: 9199 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

自定义数据结构—MyHashMap

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

相关推荐

Global site tag (gtag.js) - Google Analytics