书上说两个对象equals,必须hashCode也相等。一个例子:
class Forest1{
private String name;
public Forest1(String name){this.name = name;}
public boolean equals(Object p){
return ((Forest1)p).name.equals(this.name);
}
}
public class Forest{
public static void main(String [] args){
Forest1 f1 = new Forest1("abc");
Forest1 f2 = new Forest1("abc");
System.out.println(f1.hashCode());
System.out.println(f2.hashCode());
System.out.println(f1.equals(f2));
}
}这里f1和f2的hashCode不相同,为什么f1..equals(f2)确实true?哪位大神解释下
class Forest1{
private String name;
public Forest1(String name){this.name = name;}
public boolean equals(Object p){
return ((Forest1)p).name.equals(this.name);
}
}
public class Forest{
public static void main(String [] args){
Forest1 f1 = new Forest1("abc");
Forest1 f2 = new Forest1("abc");
System.out.println(f1.hashCode());
System.out.println(f2.hashCode());
System.out.println(f1.equals(f2));
}
}这里f1和f2的hashCode不相同,为什么f1..equals(f2)确实true?哪位大神解释下
您目前Forest1这个类需要override hashCode()。
最多只能算个规定,规范。当然最好是要遵守这个规范,不然当这个对象涉及到hashcode相关操作就会出问题。比如HashMap
public int hashCode(){
int result = 17 ;
result = 37*result +name.hashCode();
return result;
}
首先条件不满足,产生的结果是不可预知。
书上说两个对象equals,必须hashCode也相等。:
这只是一个约定,不遵守并不影响程序运行;
只是在某些运用上需要注意
比如HashMap中put 和get都是比较key的hashcode
而HashSet比较的是equals