我们在计算一个key的hash值所对应的桶下标时,正常情况下是可以用取余的操作,就是假设你的散列表长度是16的话,那么你这个hash值除余16就可以得到0到15的位置了。
但是还有一种更快的方法就是与上(&)散列表长度-1的情况,相比于除法采用二进制的&运算就能提高运算效率。但是这种算法要能使用的前提是散列表的长度是2的幂次方,因为只有2的幂次方-1后是11111这种多个1的排序,&上之后就可以得到0-15的桶位下标。
final NodegetNode(int hash, Object key) { Node [] tab; Node first, e; int n; K k; if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) { // 判断该节点对应的桶位下标 if (first.hash == hash && ((k = first.key) == key || (key != null && key.equals(k)))) return first; if ((e = first.next) != null) { if (first instanceof TreeNode) return ((TreeNode )first).getTreeNode(hash, key); do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } while ((e = e.next) != null); } } return null; }
笔者个人博客,欢迎关注:
https://www.yuque.com/yinhe-dglmu



