Java中Object类的equals()和hashCode()方法深刻解析

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()在某种程度上来得快。

相关文章
相关标签/搜索