转载 http://www.cnblogs.com/lwbqqyumidi/p/3693015.htmlhtml
public native int hashCode();算法
hashCode()方法返回一个整形数值,表示该对象的哈希码值。性能
hashCode()具备以下约定:spa
1).在Java应用程序程序执行期间,对于同一对象屡次调用hashCode()方法时,其返回的哈希码是相同的,前提是将对象进行equals比较时所用的标尺信息未作修改。在Java应用程序的一次执行到另一次执行,同一对象的hashCode()返回的哈希码无须保持一致;htm
2).若是两个对象相等(依据:调用equals()方法),那么这两个对象调用hashCode()返回的哈希码也必须相等;对象
3).反之,两个对象调用hasCode()返回的哈希码相等,这两个对象不必定相等。blog
即严格的数学逻辑表示为: 两个对象相等 <=> equals()相等 => hashCode()相等。所以,重写equlas()方法必须重写hashCode()方法,以保证此逻辑严格成立,同时能够推理出:hasCode()不相等 => equals()不相等 <=> 两个对象不相等。内存
可能有人在此产生疑问:既然比较两个对象是否相等的惟一条件(也是冲要条件)是equals,那么为何还要弄出一个hashCode(),而且进行如此约定,弄得这么麻烦?数学
其实,这主要体如今hashCode()方法的做用上,其主要用于加强哈希表的性能。hash
以集合类中,以Set为例,当新加一个对象时,须要判断现有集合中是否已经存在与此对象相等的对象,若是没有hashCode()方法,须要将Set进行一次遍历,并逐一用equals()方法判断两个对象是否相等,此种算法时间复杂度为o(n)。经过借助于hasCode方法,先计算出即将新加入对象的哈希码,而后根据哈希算法计算出此对象的位置,直接判断此位置上是否已有对象便可。(注:Set的底层用的是Map的原理实现)
在此须要纠正一个理解上的误区:对象的hashCode()返回的不是对象所在的物理内存地址。甚至也不必定是对象的逻辑地址,hashCode()相同的两个对象,不必定相等,换言之,不相等的两个对象,hashCode()返回的哈希码可能相同。
注:两个对象利用hash算法肯定存储位置时,可能放到同一个位置,这时候须要处理这个冲突。