浅析hashCode()和equals()关系
来源:互联网 发布:网络研修日志 编辑:程序博客网 时间:2024/05/17 23:22
散列码是由对象的实例域产生的一个整数。准确来说,不同的数据域的对象将产生不同的散列码。
hashCode()返回对象的散列码。
Object类中的hashCode方法:
public native int hashCode();
说明是一个本地方法,它的实现是根据本地机器相关的。和抽象方法类似,如果自定义类,就要负责实现这个类的hashCode方法。但是自己实现的hashCode方法要和equals方法兼容,即如果a.equals(b)为true,a与b必须具有相同的散列码。
Object类中的equals方法:
public boolean equals(Object obj) { return (this == obj); }很明显,这是对两个对象地址值的比较。但是并非所有equals方法都是对地址值的比较,如String、Math以及Integer,Double等包装类型。详见:equals和"=="的区别
java中对equals方法和hashCode方法的规定:
- 如果两个对象相同,即x.equals(y)为true,则x.hashCode()等于y.hashCode
- 如果两个对象的hashCode相同,这两个对象不一定是同一个对象。
String类中的hashCode方法覆盖了Object的hashCode方法:
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }Sting类中hashCode给出了散列码的计算方式,该方法返回相应字符串对象的散列码。
String类中的equals方法覆盖了Object类中的equals方法:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }可以看出,equals方法将传入的字符串对象转换为字符数组,然后按字符进行比较。
因而在String类中,equals方法比较的是两个字符串对象的内容。
总之,equals方法和hashCode方法之间的推理关系总结如下:
equals()相等的两个对象,hashcode()一定相等;
hashCode()不相等的两个对象,equals()一定不相等。
equals()不相等的两个对象,不能证明hashCode()不相等。换言之,equals()不相等的两个对象,hashCode()有可能相等。因为可能造成某种哈希冲突。
hashCode()相等的两个对象,equals()有可能相等,也可能不等。
阅读全文
0 0
- 浅析hashCode()和equals()关系
- Equals()和HashCode()的关系
- equals和hashcode的关系
- hashCode() 和 equals() 的关系
- equals和hashCode关系分析
- 浅析hashcode和equals和“==”
- equals和hashCode之间的关系
- java中equals()和hashcode()的关系
- java中equals()和hashcode()的关系
- java中的hashCode()和equals()的关系
- hashCode和equals方法的关系
- equals()和hashCode()是什么关系
- 浅谈hashCode 和 equals 的关系
- java 中 equals()和hashCode()的关系
- java里equals和hashCode的关系
- hashCode和equals方法的关系
- Java中的equals()和hashcode()之间关系
- java中的hashCode()和equals()的关系
- Leetcode Algorithm 006. ZigZag Conversion
- 产品(设计)的灵感/构想/战略
- dpkg: error: parsing file ' /var/lib/dpkg/updates/0012' near line在字段名 #padding 有换行符。
- Eclipse配置MyBatis的xml自动提示
- Java程序设计教程(第三版) 雍俊海 8.6 答案/代码
- 浅析hashCode()和equals()关系
- MySQL数据库覆盖索引
- 文档新建、打开及关闭的过程
- 千万千万不要运行的Linux命令
- 函数的公有属性和私有属性
- .NET内置特性(一)
- Java简单操作Properties配置文件(实例详解)
- hive原理与源码分析-ACID及总结(八)
- 用python写登陆界面