equals()是对象类object的基础方法,可以被重写,如果不重写,意义和==没有区别(string类默认重写了equals方法和hashCode方法).
hashCode()生成的是散列值,在散列表中有用,散列表通过散列值可以快速的定位数据位置,支持散列表的集合像HashMap.HashSet等.
散列表判断相等是hashCode和equal都相等的对象才为相等下面用代码证明:
public class Main {
public static void main(String[] args) {
P p1=new P("a",1);
P p2=new P("a",1);
P p3=new P("b",2);
Set set= new HashSet();
set.add(p1);
set.add(p2);
set.add(p3);
System.out.printf("%s%n",set);
System.out.println(p1.equals(p2)+";"+p1.equals(p3)+";"+p1.hashCode()+";"+p2.hashCode()+";"+p3.hashCode());
}
static class P {
private String a;
private Integer b;
P(String a,Integer b){
this.a=a;
this.b = b;
}
@Override
public String toString() {
return "["+a+","+b+"]";
}
}
}
返回结果:
[[b,2], [a,1], [a,1]]
false;false;1987083830;1632492873;525683462
可见没有重写equals方法和hashCode方法,equels方法和hashSet都不承认p1和p2相等.
修改代码,增加hashCode方法的重写:
@Override
public int hashCode(){
int aHash = a.toUpperCase().hashCode();
return aHash;
}
返回结果:
[[a,1], [a,1], [b,2]]
false;false;65;65;66
可见没有重写equals方法,equels方法和hashSet都不承认p1和p2相等.
修改代码,去掉hashCode方法的重写,增加equals方法的重写:
@Override
public boolean equals(Object object){
P temp = (P)object;
boolean ares = temp.a.equals(this.a);
boolean bres = temp.b.equals(this.b);
return ares&&bres;
}
返回结果:
[[b,2], [a,1], [a,1]]
true;false;1987083830;1632492873;525683462
可见没有重写hashCode方法,hashSet都不承认p1和p2相等.
增加hashCode方法,equals方法的重写:
@Override
public int hashCode(){
int aHash = a.toUpperCase().hashCode();
return aHash;
}
@Override
public boolean equals(Object object){
P temp = (P)object;
boolean ares = temp.a.equals(this.a);
boolean bres = temp.b.equals(this.b);
return ares&&bres;
}
返回结果:
[[a,1], [b,2]]
true;false;65;65;66
可见equels方法和hashSet都承认p1和p2相等.