java中hashmap的实现原理
2020-12-13 15:14
标签:而不是 string 初始化 返回 下标 条件 bsp 传递 等于 HashMap底层是一个数组,通过允许冲突来实现大小可扩充。数组的下标是对象的散列码,存储的是list,查询list的时候是线性equals()比较(所以速度的瓶颈在于不能让list过长,也就是数据不能太集中)。 放入HashMap的对象要实现2个方法,hashCode()和equals()。 equals()正确的实现必须满足5个条件: 1、自反性:x.equals(x)必为true 2、对称性:x.equals(y)等于y.equals(x) 3、传递性:若x.equals(y)为true,且y.equals(z)为true,必有x.equals(z)为true 4、一致性:x.equals(y)的值不会因为调用次数的改变而改变 5、x不是null时,x.equals(null)比为false hashCode()的编写: 1、hashCode()不应依赖于易变的数据,同一个对象调用hashCode()返回的值必须相等 2、不应使用this,此时put()和get()产生的hashCode()也不相同 3、对于hashCode()来说,应该更关注生成速度而不是唯一性,它是允许冲突的 4、应该要分布均匀 如何编写好的散列码已经有了较好的指导: 1、初始化结果int hashcode=17 2、添加每一个域,如有两个成员String name;和int id;,则 hashcode=hashcode*37+name的哈希码; hashcode=hashcode*37+id的哈希码; 至于域的哈希码如何计算,详情见《java编程思想》496(溜了 java中hashmap的实现原理 标签:而不是 string 初始化 返回 下标 条件 bsp 传递 等于 原文地址:https://www.cnblogs.com/towerbird/p/11575361.html
上一篇:C# JSON帮助类
下一篇:WPF产生不重复的随机数