Java中的hashCode方法

转载 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算法肯定存储位置时,可能放到同一个位置,这时候须要处理这个冲突。

相关文章
相关标签/搜索