1、选择数字31是因为它是一个奇质数,如果选择一个偶数会在乘法运算中产生溢出,导致数值信息丢失,因为乘二相当于移位运算。选择质数的优势并不是特别的明显,但这是一个传统。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站设计、铜陵网络推广、小程序制作、铜陵网络营销、铜陵企业策划、铜陵品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供铜陵建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
2、数字31有一个很好的特性,即乘法运算可以被移位和减法运算取代,来获取更好的性能:31 * i == (i << 5) - i,现代的 Java 虚拟机可以自动地完成这个优化。
数组的特点是:寻址容易,插入和删除困难。
链表的特点是:寻址困难,插入和删除容易。
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
扰动函数就是为了增加随机性,让数据元素更加均衡地散列,减少碰撞。
static final float DEFAULT_LOAD_FACTOR = 0.75f;
负载因子,可以理解成一辆车可承重重量超过某个阀值时,把货放到新的车上。在 HashMap 中,负载因子决定了数据量多少了以后进行扩容。
0.75 是一个默认构造值,在创建 HashMap 也可以调整,如何希望用更多的空间换取时间,可以把负载因子调得更小一些,减少碰撞。
扩容最直接的问题,就是需要把元素拆分到新的数组中,在JDK1.7中,会重新计算哈希值,但在JDK1.8后,进行了优化。
在转换树的过程中,记录了原有链表的顺序,红黑树转链表时候,直接把TreeNode转换为Node,因为记录了链表关系,所以替换过程很容易。
链表超过 8 位后扩容,而是直接让其转换为红黑树。
测试代码
public void test_Iterator() {
Mapmap = new HashMap (64);
map.put("24", "Idx:2");
map.put("46", "Idx:2");
map.put("68", "Idx:2");
map.put("29", "Idx:7");
map.put("150", "Idx:12");
map.put("172", "Idx:12");
map.put("194", "Idx:12");
map.put("271", "Idx:12");
System.out.println("排序01:");
for (String key : map.keySet()) {
System.out.print(key + " ");
}
map.put("293", "Idx:12");
map.put("370", "Idx:12");
map.put("392", "Idx:12");
map.put("491", "Idx:12");
map.put("590", "Idx:12");
System.out.println("\n\n排序02:");
for (String key : map.keySet()) {
System.out.print(key + " ");
}
map.remove("293");
map.remove("370");
map.remove("392");
map.remove("491");
map.remove("590");
System.out.println("\n\n排序03:");
for (String key : map.keySet()) {
System.out.print(key + " ");
}
}
结果如下:
排序01:
24 46 68 29 150 172 194 271
排序02:
24 46 68 29 271 150 172 194 293 370 392 491 590
排序03:
24 46 68 29 172 271 150 194
Process finished with exit code 0
这一篇 API 源码以及逻辑与上一篇数据结构中扰动函数、负载因子、散列表实现等,内容的结合,算是把 HashMap 基本常用技术点,梳理完成了。但知识绝不止于此,这里还有红黑树的相关技术内容,后续会进行详细。
除了 HashMap 以外还有 TreeMap、ConcurrentHashMap 等,每一个核心类都有一与之相关的核心知识点,每一个都非常值得深入研究。这个烧脑的过程,是学习获得的知识的最佳方式。
分享名称:重温数据结构经典:HashCode及HashMap原理
URL链接:http://www.mswzjz.cn/qtweb/news6/484306.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能