两个对象的 hashCode()相同,则 equals()也一定
今天看见了这个问题,网上百度了下,答案是不一定,然后看了讲解,看的很迷糊,可能是自己对这块的基础太差,不能理解吧,所以本人决定慢慢从最基础尝试理解了解这块
1.概念了解:hashCode() 和 equals() 是什么?
hashCode() 和 equals() 是超类java.lang.Object中两个重要的方法,
Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法
2.详细解读:
hashCode()
hashCode()方法给对象返回一个hash code值。这个方法被用于hash tables,例如HashMap
equals()
equals()方法是用来判断其他的对象是否和该对象相等.
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)
基本数据类型(byte,short,char,int,float,double,long,boolean),比较的是值,
引用类型:比较的是引用是否相同;
3.案例测试:
简单基本情况:
Object str="123";
System.out.println("str.hashCode()"+str.hashCode());
str="1234";
System.out.println("str.hashCode()"+str.hashCode());
Object str1="123";
System.out.println("str1.hashCode()"+str1.hashCode());
Object str2=123;
System.out.println("str2.hashCode()"+str2.hashCode());
Object str3="123";
System.out.println("str3.hashCode()"+str3.hashCode());
System.out.println("str1==str2"+(str1==str2));
System.out.println("str1==str3"+(str1==str3));
System.out.println("str1.equals(str2)"+(str1.equals(str2)));
System.out.println("str1.equals(str3)"+(str1.equals(str3)));
结果:
str.hashCode() 48690
str.hashCode() 1509442
str1.hashCode() 48690
str2.hashCode() 123
str3.hashCode() 48690
str1 == str2 false
str1 == str3 true
str1.equals( str2 ) false
str1.equals( str3 ) true
hashCode()相同,equals 和 == 都成立。
自己新建对象,equals 和hashCode 通过工具自动生成:
static class Person{
public int age;
public String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals( name, person.name );
}
@Override
public int hashCode() {
return Objects.hash( age, name );
}
}
//测试类
Person person1=newPerson(20,"Allen");
Person person2=newPerson(30,"Allen");
System.out.println("person1.hashCode()"+person1.hashCode());
System.out.println("person2.hashCode()"+person2.hashCode());
System.out.println("person1.equals(person2)"+(person1.equals(person2)));
测试结果:
person1.hashCode() 63354903
person2.hashCode() 63355213
person1.equals( person2 ) false
两个不同对象,hashCode 不同,equals 为false
自己新建对象,重新hashCode 方法:
staticclassPerson{
publicintage;
publicStringname;
publicPerson(intage,Stringname){
this.age=age;
this.name=name;
}
@Override
publicbooleanequals(Objecto){
if(this==o)returntrue;
if(o==null||getClass()!=o.getClass())returnfalse;
Personperson=(Person)o;
returnage==person.age&&
Objects.equals(name,person.name);
}
@Override
publicinthashCode(){
//其实hashCode无非是通过算法返回的一个int值
//自动生成得到hashCode
//returnObjects.hash(age,name);
returnage%10;
}
}
测试结果:
person1.hashCode() 0
person2.hashCode() 0
person1.equals( person2 ) false
两个不同对象,hashCode 相同,equals 为false
hashCode 无非是通过算法返回的一个int值,重写可能导致相同
关于hashCode和equal是方法是有一些 常规协定 :
1、两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。
2、两个对象用equals()比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,提搞哈希表性能。
3、重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。
最后,理解的还是不够深刻,只能从测试案例中得到答案,后续有新的理解在补充
hashCode相等,equals也不一定相等, 两个类也不一定相等
equals相同, 说明是同一个对象, 那么hashCode一定相同