Java的equals方法和hashCode方法详解

equals方法:

首先我们看一下object对象的equals方法源码:

public boolean equals(Object obj) {
    return (this == obj);
}

从中我们可以看出object的equals方法是直接比较两对象的地址的。

再来看一下Integer的:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Integer是先判断类型是否一致,然后再比较值。

String的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;
    }

String首先是比较地址,如果不一致就判断类型是否一致,然后再比较它们的长度,长度一致的话,就按一个字符一个字符的进行比较。

hashCode方法:

Object的hashCode方法源码:
public native int hashCode();
native修饰:意思就是说Java调用了一个非Java代码的接口。

每个对象都有一个默认的散列码,值就是对象的的内存地址(散列码是无规律的)。

不同对象,hashCode值一定不同。

Integer的hashCode方法源码:
    public static int hashCode(int value) {
        return value;
    }

int是直接返回它的值的。

String的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;
    }

String类中的hashCode计算方法还是比较简单的,就是以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模。
哈希计算公式可以计为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
关于为什么取31为权,主要是因为31是一个奇质数,所以31*i=32*i-i=(i<<5)-i,这种位移与减法结合的计算相比一般的运算快很多。 

String类的hashCode源码解析,转载地址:https://www.cnblogs.com/micrari/p/5626202.html

hashCode方法和equals方法比较:

equals 如果相等,那么 hashCode 值就一定相等。

hashCode 值相等,equals 不一定相等。

如下为hashCode值相等,equals 不相等的例子:

Java的equals方法和hashCode方法详解_第1张图片

比较两个值用hashCode不靠谱,那么hashCode有什么作用呢?

 解答:

Set集合大家用过吧,特点:无序且不重复。

Set集合如果每次插入都用equals 去做比较,集合元素少的时候还好,如果集合元素多,每一个都用equals去判断,效率是不是就特别低了呀。

这个时候hashCode的用处就大了,把hashCode值比作一个地址,Set集合每次插入,就根据插入元素的hashCode值去指定地址查找,如果没有找到相同的hashCode值,就直接插入。如果找到,再用equals去比较,这样使用equals的次数是不是就大大减少了,那么速度自然也就快了。

 

最后,文中如有错误的地方,请各位大佬多多指定,谢谢!

 

你可能感兴趣的:(Java)