论坛首页 Java企业应用论坛

由HashMap的实现联想到的

浏览 1449 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-25  
首先温故一下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,那这还真是个不错的想法,至少这样混搭避免了大数组的创建和拷贝。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics