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