java中hashmap的实现原理

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(溜了

原文地址:https://www.cnblogs.com/towerbird/p/11575361.html