`
543089122
  • 浏览: 149674 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

由HashMap的实现联想到的

阅读更多
首先温故一下java.util.HashMap的实现
int i = indexFor(hash, table.length);

static int indexFor(int h, int length) {
        return h & (length-1);
}


原理:java中的HashMap是基于哈希表的 Map 接口的实现,内部是用数组+链表实现的,性能方面 哈希表>二叉树>线性表.为什么哈希表这么快呢?通过查看源码得知

通过把哈希值和数组长度进行与运算,为什么要进行与运算呢?因为与运算后得到的数字一定大于等于0并且小于等于数组长度。
(&运算:同位都为1则为1,否则为0。这样2个数进行&运算后得到的10进制数一定0<=n<=len)。

--------------------------------------
联想:不废话单刀直入,HashMap是由hash和链表混搭成的,于是我就想到为什么不那hash和平衡二叉树进行混搭呢?那样即便是冲突了,访问速度也不会完全退化到线性表啊!我想这个我们的Doug Lea大牛应该早就考虑过了,我估计他主要是HashMap做为单纯的hash表来使用,告知使用者尽量减少冲突,那个链表只是个小小的辅助职业而已。

于是我想在以后的开发中如果有比如有某个需求会用到hash+tree,那这还真是个不错的想法,至少这样混搭避免了大数组的创建和拷贝。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics