1.equals()数据结构
在初学Java的时候,不少人会说在比较对象的时候,==是比较地址,equals()是比较对象的内容,谁说的?函数
看看equals()方法在Object类中的定义:this
public boolean equals(Object obj){
return (this == obj);
}设计
这是比较内容么?明显是比较指针(地址)么...指针
可是为何会有equals是比较内容的这种说法呢?对象
由于在String、Double等封装类中,已经重载(overriding)了Object类的equals()方法,因而有了另外一种计算公式,是进行内容的比较。hash
好比在String类中:方法
public int hashCode() {
int h = hash;
if (h == 0) {
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
} im
2.hashCode()数据
在Object类中的定义为:
public native int hashCode();
是一个本地方法,返回的对象的地址值。
可是,一样的思路,在String等封装类中对此方法进行了重写。方法调用获得一个计算公式获得的 int值
3.二者的关系
①两个obj,若是equals()相等,hashCode()必定相等
②两个obj,若是hashCode()相等,equals()不必定相等
缘由:从散列的角度考虑,不一样的对象计算哈希码的时候,可能引发冲突,你们必定还记得数据结构中冲突的解决方案吧
可是要这么设计,用两个函数,我的的理解是为了比较两个对象时更高效。
能够考虑在Java集合中,判断两个对象是否相等的规则是:
第一步,若是hashCode()相等,则查看第二步,不然不相等;
第二步,查看equals()是否相等,若是相等,则两obj相等,不然仍是不相等。
为何这样作?我的的理解是让适当的函数完成适当的功能,毕竟hashCode()比equals()在某种程度上来得快。