在Java或者Android开发中==和equals基本上是最常用的,但他们有什么区别,equals和hashCode又有什么联系呢?
== 是运算符,判断两个值是否相等
equals是Object类中的一个方法
内部也是通过==判断两个对象的地址是否相同
public boolean equals(Object obj) { return (this == obj);}复制代码
而String类型的对象在使用equals方法的时候两个new出来的相同内容,对象不同,结果却为true,为什么呢,咱们来看下源码:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = length(); if (n == anotherString.length()) { int i = 0; while (n-- != 0) { if (charAt(i) != anotherString.charAt(i)) return false; i++; } return true; } } return false;}复制代码
可以看出,String对象重写了Object类的equals方法,在判断引用地址之后,又增加了类型和内容的判断。在这里,也能够体现出重写equals方法的原则:
- 先判断引用地址是否相同
- 在判断类型是否相同
- 最后判断内容是否相同
hashCode也是Object类中的一个方法
hashCode在集合类操作中使用,提高查询速度,系统用来快速检索对象来使用,不经常外在使用,可以被用来作为一个对象的唯一标识。
也可以被重写,可以参照String重写方式:
public int hashCode() { int h = hash; final int len = length(); if (h == 0 && len > 0) { for (int i = 0; i < len; i++) { h = 31 * h + charAt(i);//递推公式 } hash = h; } return h;}复制代码
equals和hashCode在重写时有以下几个原则:
- equals相等时,hashCode必须相等;
- equals不等时,hashCode可能相等也可能不相等;
- hashCode不相等时,equals一定不相等。