【JVM】-NO.111.JVM.1 -【JDK11 HashMap详解-1-hash()剖析】
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. hash()
private int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
疑问:
1.1 为什么 h右移16位?
1.2 为什么 h^右移16位的自己?
直觉:
1.这一定是个牛逼轰轰的算法,能够让所有对象的hash后的值尽可能的松散不重复
原理引用:
1.int可以表示成32位的二进制数
2.>>> 即向右移动若干位,无符号
3.^ 异或,a!=b,则为1
4. & 与, a=b=1,则为1
5. | 或,(a|b)=1,则为1
6. ^ 非, 取反
推导:
1. 为何是16位不是18位或者17位?右移16位和32位有毛关系?
举例:

疑问:为什么要用 ^ 而不是 | & !?

通过上述可以看出来
只有^的结果是不唯一的,而& |的结果都是有重复的
所以^的特性能够实现该算法结果不会重复
结论:
该算法可以实现随着hashcode的递增,hash()的值不重复的递增
很好的生成hash分布均匀的值
经验:
1.除了明白位运算的简单结果,还要明白其具备的特性在算法中的实际应用。
如 a^0的时候仍为a,可以利用这个在hash中进行散列使用
2.移位运算,除了寻常的对2的次幂如,a<<n是 a乘以2的n次, a>>n是 a除以2的n次,之外还有通过本质的二进制看待,可以实现折半的效果
3.尽可能的让hashcode不重复,最终得出来hash()值才不重复,否则一堆自己重写hashcode()指定值为1,hash()后的结论也是不松散的。
【JVM】-NO.111.JVM.1 -【JDK11 HashMap详解-1-hash()剖析】的更多相关文章
- 【JVM】-NO.110.JVM.1 -【JDK11 HashMap详解】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【JVM】-NO.113.JVM.1 -【JDK11 HashMap详解-0-全局-put】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【JVM】-NO.113.JVM.1 -【JDK11 HashMap详解-4-resize()】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【JVM】-NO.114.JVM.1 -【JDK11 HashMap详解-3-put-treeifyBin()-AVL】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【JVM】-NO.115.JVM.1 -【JDK11 HashMap详解-4-伸展树、B树】
.Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【JVM】-NO.116.JVM.1 -【JDK11 HashMap详解-5-红黑树】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 【JVM】-NO.112.JVM.2 -【JDK11 HashMap详解-2-tab[i = (n - 1) & hash])剖析】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- 【转】 java中HashMap详解
原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...
随机推荐
- 代码注释中的专有词——TODO、FIXME和XXX
[时间:2017-09] [状态:Open] [关键词:代码注释,TODO, FIXME, XXX] 阅读开源代码时可能经常遇到TODO.FIXME.XXX的单词,通常这些都是有其特殊含义的. 中文版 ...
- SqlServer 行转一列逗号隔开
SELECT STUFF( (SELECT ',' + convert(varchar(10),PID) FROM tt WHERE a='老王' FOR xml path('') ),1,1,'' ...
- 【转】wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用
通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelect ...
- 我对CopyOnWrite的思考
CopyOnWrite 后文中表述为 COW CopyOnWrite容器即写的时候复制一个新的容器进行写:通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy ...
- springboot-thymeleaf
Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: Thymeleaf 在有网络和无网络 ...
- puppet(2)-资源介绍
puppet- 资源介绍: 类型.属性与状态同实现方式分离.仅指定目标状态 type {'title': attribute => value, ... } 查看支持的资源类型: puppet ...
- C_C++变量命名规则
变量命名规则是为了增强代码的可读性和容易维护性.以下为C++必须遵守的变量命名规则: 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成. 第一个字母必须是字母或者下划线开头. 不 ...
- VS 错误: 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService
今天突然停电,vs重启的时候就出现了问题,最开始是提示如图1所示的错误,开始觉得可能这提示不重要,也就关闭不在提醒了,结果,vs启动是启动了,项目也开启了,但是生成的时候,依旧就报了图1的错 图1 去 ...
- xgboost原理
出处http://blog.csdn.net/a819825294 1.序 距离上一次编辑将近10个月,幸得爱可可老师(微博)推荐,访问量陡增.最近毕业论文与xgboost相关,于是重新写一下这篇文章 ...
- vue---computed计算属性的使用
一直以来在使用vue的时候,会对vue的computed属性和watch属性具体的使用分不清楚,总算花点时间整理了下. computed:通常用于监控自己定义的变量,这个变量可以不再data中定义,直 ...