Hash函数:任意长度的消息压缩成某一固定长度消息的函数。即Hash就是找到一种数据内 容和数据存放地址之间的映射关系。
任何class如果覆写了equals()方法,就必须覆写hashCode()。
1。在程序执行期间,同一个对象调用hashCode()必须返回同一个值(同一个应用执行期)。
2。如果两个对象equals,那么他们的hashCode()必须相等。
3。如果两个对象equals不相等,那么他们的hashCode()不必产生不同的结果,程序员应该注意到,对不同的对象产生不同的hashCode(),有可能提升 hash table(哈希表)的效率
何时重写hashCode()?
1.当一个对象被当作键值(或索引)来使用的时候。
2.添加到Set中的对象必须要定义equals(),以至于必须要重写hashCode()。
两条重写HashCode()的原则:
不必对每个不同的对象都产生一个唯一的hashcode,只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即“不为一原则”。 生成hashcode的算法尽量使hashcode的值分散一些, 不要很多hashcode都集中在一个范围内,这样有利于提高HashMap的性能。即“分散原则”。 至于第二条原则的具体原因,有兴趣者可以参考Bruce Eckel的《Thinking in Java》,
在那里有对HashMap内部实现原理的介绍,这里就不赘述了。
掌握了这两条原则,你就能够用好HashMap编写自己的程序了。不知道大家注意没有, java.lang.Object中提供的三个方法:clone(),equals()和hashCode()虽然很典型, 但在很多情况下都不能够适用,它们只是简单的由对象的地址得出结果。 这就需要我们在自己的程序中重写它们,其实java类库中也重写了千千万万个这样的方法。 利用面向对象的多态性——覆盖,Java的设计者很优雅的构建了Java的结构,也更加体现了Java是一门纯OOP语言的特性。
任何class如果覆写了equals()方法,就必须覆写hashCode()。
1。在程序执行期间,同一个对象调用hashCode()必须返回同一个值(同一个应用执行期)。
2。如果两个对象equals,那么他们的hashCode()必须相等。
3。如果两个对象equals不相等,那么他们的hashCode()不必产生不同的结果,程序员应该注意到,对不同的对象产生不同的hashCode(),有可能提升 hash table(哈希表)的效率
何时重写hashCode()?
1.当一个对象被当作键值(或索引)来使用的时候。
2.添加到Set中的对象必须要定义equals(),以至于必须要重写hashCode()。
两条重写HashCode()的原则:
不必对每个不同的对象都产生一个唯一的hashcode,只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即“不为一原则”。 生成hashcode的算法尽量使hashcode的值分散一些, 不要很多hashcode都集中在一个范围内,这样有利于提高HashMap的性能。即“分散原则”。 至于第二条原则的具体原因,有兴趣者可以参考Bruce Eckel的《Thinking in Java》,
在那里有对HashMap内部实现原理的介绍,这里就不赘述了。
掌握了这两条原则,你就能够用好HashMap编写自己的程序了。不知道大家注意没有, java.lang.Object中提供的三个方法:clone(),equals()和hashCode()虽然很典型, 但在很多情况下都不能够适用,它们只是简单的由对象的地址得出结果。 这就需要我们在自己的程序中重写它们,其实java类库中也重写了千千万万个这样的方法。 利用面向对象的多态性——覆盖,Java的设计者很优雅的构建了Java的结构,也更加体现了Java是一门纯OOP语言的特性。