Style:Mac

Series:Java

Since:2018-09-10

End:2018-09-10

Total Hours:1

Degree Of Diffculty:5

Degree Of Mastery:5

Practical Level:5

Desired Goal:5

Archieve Goal:3

Gerneral Evaluation:3

Writer:kingdelee

Related Links:

http://www.cnblogs.com/kingdelee/

http://www.runoob.com/java/java-operators.html

1.key是如何hash后去找到合适的坑填进去?

Node<K,V>[] tab; Node<K,V> p; int n, i;
logger.info("将table赋给tab");
if ((tab = table) == null || (n = tab.length) == 0) {
logger.info("table为null");
n = (tab = resize()).length; // 1.当未指定初始容量时,进行resize, 得到容量值赋给n=16; 获得新的节点给tab;已经存在节点时不再进来
logger.info("tab renTab");
}
logger.info("tab[i = (n - 1) & hash]): tab["+((n - 1) & hash)+"] i:" + ((n - 1) & hash) + ", hash:" + hash);
if ((p = tab[i = (n - 1) & hash]) == null) // i: (16-1) & 10 = 10,未存在节点的情况下,让新节点P指向数组节点tab中的hash后的节点,创建节点数组;已经存在节点时不再进来
{
logger.info("创建一个新节点,tab["+i+"]指向这个节点" + "hash:" + hash + ",value:" + value);
tab[i] = newNode(hash, key, value, null); // 仅在p节点为空的情况下,创建刚刚新节点指向hash后为空的节点的位置
}

  

重点看:

n = tab.length
或者
n = (tab = resize()).length; 填坑入槽:
tab[i = (n - 1) & hash]

初始化时,n为16.

推论:

1.ab进行&运算,c一定<=ab中的最小值;即 (n-1) & hash的值i,一定是在长度内的,不会越界,且坑位受hash的散列能力影响

疑问:如果len长度不是16而是17或者18呢?

即len是17时,n-1则为16,即a为16;len是18时,n-1则为17,即a为17

发现c有很多是一样的,即很多值都掉到同一个坑位里了。散列能力极差。

观察发现,有且只有a为1111,11111,111111....都是1时,b的递增,c才会依次递增

即a为是2的n次幂-1

结论:

1.len一定是2的次幂,才能保证横向散列的能力,让key能够松散的填入tab数组坑中。

  

最新文章

  1. 用Redis实现分布式锁
  2. C#的winform编程入门简单介绍
  3. sql server 关联更新
  4. web 页面内容优化管理与性能技巧
  5. 浅谈对git的认识
  6. Frame Stacking 框架堆叠
  7. Struts2文件下载浅析
  8. poj 1274 The Perfect Stall【匈牙利算法模板题】
  9. RHEL 7特性说明(六):集群
  10. ckeditor与ckfinder简单整合使用
  11. 在Linux系统如何让程序开机时自动启动
  12. Jquery插件之ajaxForm ajaxSubmit的理解用法
  13. jQuery 判断checkbox是否被选中 4种方法
  14. Oracle问题之字符集问题,登陆sqlplus出现问号
  15. Struts2笔记_拦截器
  16. Django----admin模块初识
  17. Mysql5.7 单表 500万数据迁移到新表的快速实现方案
  18. Python学习笔记第三周
  19. 5.1_非监督学习之sckit-learn
  20. [原创]K8飞刀20150720 新增Shellcode Loader支持多种格式

热门文章

  1. 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇
  2. 在interface vlan下敲no ip proxy-arp什么意思
  3. maven添加jetty插件,同时运行多个实例
  4. [Linux]linux下取消用户名和密码直接登录
  5. VM虚拟机下安装CentOS_6.5_x64
  6. Linux c time模块函数库
  7. python学习笔记(四)
  8. HTTP简介,http是一个属于应用层的面向对象的协议
  9. python2.7.X 升级至Python3.6.X
  10. HTTP状态码--含义