【思考】为什么JAVA要同时重写equals和hashcode

什么是equals

 

equals()在java.lang.Object下

其源码为: 所以Object对象的equals其实就是比较是否为同一对象的引用

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

举例:

Student s1=new Student(001,"王大锤");
Student s2=new Student(001,"王大锤");
//结果为false
System.out.println(s1.equals(s2));

 

 

equals()在String下

只比较值,因为在String类中对equals方法进行了重写的原因。

String str1="123";
String str2="123";
//print true
System.out.println(str1.equals(str2));

 

 

什么是hashcode方法

在java中,对对象的存储采取了存储在哈希表中处理方法,hashcode方法是根据对象的地址转换之后返回的一个哈希值

就需要对哈希表有一个基本的认识。其基本的结构如下:

 

 

 

 

对于hashcode方法,会返回一个哈希值,哈希值对数组的长度取余后会确定一个存储的下标位置,如图中用数组括起来的第一列。

不同的哈希值取余之后的结果可能是相同的,时候就用equals方法判断是否为相同的对象,不同则在链表中插入。

 

所以:

hashcode不相同,用equals()方法判断的返回的一定为false。

hashcode相同,equals()方法返回值不能确认,可能为true,可能为false。

 

先调用hashCode,唯一则存储,不唯一则再调用equals,结果相同则不再存储,结果不同则散列到其他位置。因为hashCode效率更高(仅为一个int值),比较起来更快。

 

样例说明:

1.只重写了equals

 

 测试类:

 

结果:

 

 

出现矛盾!!!

用equals比较说明对象相同,但是在HashMap中却以不同的对象存储(没有重写hascode值,两个hascode值,在他看来就是两个对象)。到底这两个对象相等不相等????说明必须重写hashCode()的重要性,

 

2.同时重写equals方法和hashCode方法

 

 测试类

 

 结果

 

posted @ 2020-04-27 00:08  林被熊烟岛  阅读(248)  评论(0编辑  收藏  举报