首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师 java 分析 equals方法和hashCode方法

2013-02-24 
黑马程序员 java 分析 equals方法和hashCode方法----------android培训、java培训、java学习型技术博客、期待

黑马程序员 java 分析 equals方法和hashCode方法

----------android培训、java培训、java学习型技术博客、期待与您交流! ----------

一看就知道是判断两个对象的地址(即引用)是否相等。但是我们必需清楚,当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关系之源码分析》,分析的相当认真,感谢这位作者的用心。







热点排行