黑马程序员 java 分析 equals方法和hashCode方法
一看就知道是判断两个对象的地址(即引用)是否相等。但是我们必需清楚,当String、Math、还有Integer、Double……等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。
比如String类的equals():
对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。反射性:x.equals(x)必须返回是“true”。
类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
(以上这五点是重写equals()方法时,必须遵守的准则)
是与平台相关的native函数,返回值为:这个对象的哈兮地址
hashcode方法在把对象放到一个对象容器时大派用场,一个好的hashcode算法和坏的算法,在把对象放入容器和从容器取出时,效率相差极大。
看不到Object类的hashCode()实现,那我们看一下String类重写的hashCode()的实现:
equals()相等的对象,hashCode()一定相等:(物理地址都确定相等,肯定是一个对象了)hashCode()相等的对象,equals()相等或不等:(你还记得散列表么,采用直接寻址技术,在理想状态下无须任何比较就可以找到待查关键字,查找的期望时间为o(1)。有的时候hash地址相同,但发现这个地址有元素后就会去比较和这个地址中的元素是否equals,不equals的话就要再散列找个地方存放对象。hash地址一般并不是对象存储地址,而是一个可以映射到对象物理地址的地址)
equals()不相等的对象,hashCode()有可能相等:(原因的话就是和上面一样,由哈兮冲突导致)
hashCode()不相等的对象,equals()一定不相等:(我们可以这要理解问题:哈兮码是根据关键码值(或者说对象的某些特征)来计算的来的。你想哦,比较两个对象的哈兮码,如果相同(我们可以理解为这两个对象的某些特征是相同的,但你能保证其他特征也相同吗?),如果不同(我们可以理解我,这两个对象连某些特定的特征都不相同,那这两个对象肯定不相同了))
参考文献:
ITeye作者“zhaoxudonglove”的文章《java中hashcode()和equals()的详解》
作者“L.G.Alexander”在ITeye中的文章《HashSet与HashMap关系之源码分析》,分析的相当认真,感谢这位作者的用心。