您的位置 首页 java

java的Object对象equals方法和hashcode方法的区别和联系

首先看看这两个方法是干啥的:

equals:

是用来判断两个对象是否相同,他和 ==是一样的,默认比较对象的引用,子类一般都需要重写该方法。当重写后,他就个”==”比较不一样了。两者区别如下:

1.“==”对于基本数据类型,只要值相等,就返回true,否则返回false。若比较的为对象,则判断的是两个对象是否处于同一个内存地址。

2.equals为Object类中的方法,Object中equals默认使用==来判断,因此一般来讲equals与“==”并无区别,完全相同。Object是所有类的父类,在不少类中都对equals进行了重写,比如最常用的 String类 ,因此在 String 中比较的是值,而非地址。基本类型的包装类型,比如 Boolean 、Character、 Byte 、Shot、 Integer 、Long、 Float 、Double等的引用变量,==是比较地址的,而equals是比较内容的

  • 为什么要重写equals:

因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

下面以String为例看看源码的重写:

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

java的Object对象equals方法和hashcode方法的区别和联系

我们看到红框就是具体的自定义String中的值比较。接下来我们看看 hashCode

hashcode

计算出对象实例的 哈希 码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),因此每个Object对象的hashCode都是唯一的,当然如果对应的类重写了hashcode方法就会不一定唯一了,这是重写方法的问题了。

  • 为什么会有hashcode

上面提到了每个object和hashcode都是唯一的(不重写的情况下),所以在批量处理对象比较时,如果采用equals方法并且这个还是自己重写的,要一一比较具体的属性,就会狠耗时,此时直接用hashcode比较先做个简单判断就会省时很多,具体规则会用在某些集合中:

1:如果hashCode()相等,则查看第二步,否则不相等;
2:查看equals()是否相等,如果相等,则两obj相等否 则还是不相等。

改写equals时总是要改写hashcode, java .lnag.Object中对hashCode的约定:

1.在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。(而这个hashcode肯定是根据equals比较所用到的信息生成的)

2.如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。

3.如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高 散列表 的性能。

如果改写String中的equals为基于内容上的比较而不是内存地址的话,那么虽然equals相等,但并不代表内存地址相等,由hashcode方法的定义可知内存地址不同,没改写的hashcode值也可能不同。又如new一个对象,再new一个内容相等的对象,调用equals方法返回的true,但他们的hashcode值不同,将两个对象存入HashSet中,会使得其中包含两个相等的对象,因为是先检索hashcode值,不等的情况下才会去比较equals方法的。

由上得出:

  • equals()相等的两个对象,hashcode()一定相等
  • hashcode()不等,一定能推出equals()也不等
  • hashcode()相等,equals()可能相等,也可能不等。

文章来源:智云一二三科技

文章标题:java的Object对象equals方法和hashcode方法的区别和联系

文章地址:https://www.zhihuclub.com/197622.shtml

关于作者: 智云科技

热门文章

网站地图