hashCode()和equals()

1、Object若不重写hashCode()的话,hashCode是如何计算出来的?

答:默认情况下,Object中的hashCode() 返回对象的jvm内存地址进行映射。也就是说如果对象不重写该方法,则返回相应对象的JVM内存地址。源码如下:

public native int hashCode();

new People("Jack", 12)和new People("Jack", 12)表面看相同,但确是两个实例对象,地址不同,所以两者的hashCode不相同。

根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。

2、Object若不重写equals()的话,equals()方法是如何比较的?

答:直接比较两个对象是否相等,通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等,源码如下:

public boolean equals(Object obj) {

        return (this == obj);

    }

注:若是基本数据类型,==和equals比较的都是值。

     若是对象,==比较的是地址,equals比较的是值。

3、hashCode和equals的关系?

若两个对象的hashCode相等,则equals不一定为true。

若equals为true,则两个对象的hashCode一定相等。

4、若重写equals()方法需要注意哪些问题?

1)自反性:x.equals(x)一定返回true
2)对称性:x.equals(y)返回true当且仅当y.equals(x)
3)传递性:x.equals(y)且y.equals(z),则x.equals(z)为true
4)一致性:若x.equals(y)返回true,则不改变x,y时多次调用x.equals(y)都返回true

5)对于任意的非空引用值x,x.equals(null)一定返回false。

6)若重写equals方法,一定要重写hashCode方法。否则相等对象(equals返回true)可能具有不同的散列码。

equals重写举例:

   @Override
     public  boolean  equals(Object obj) {
         // TODO Auto-generated method stub
         return  this .name.equals(((People)obj).name) &&  this .age== ((People)obj).age;
     }
即,若两个人的名字和年龄相等,则可以认为是同一个人。

5、若重写hashCode()方法需要注意哪些问题?

重写hashCode方法,让equals方法和hashCode方法始终在逻辑上保持一致性.\

 @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode()*37+age;
    }
注:hashCode中所用的属性和equals中所用的属性一样的,这样果两个对象根据equals方法比较是不等的,则hashCode方法不一定得返回不同的整数。

猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80727894