上题回顾与解析
public class Name {
private final String first, last;
public Name(String first, String last){
this.first = first;
this.last = last;
}
@Override
public boolean equals(Object o){
if(o instanceof Name){
return false;
}
Name n = (Name)o;
return n.first.equals(first) && n.last.equals(last);
}
public static void main(String[] args){
Set<Name> s = new HashSet<>();
s.add(new Name("Mickey", "Mouse"));
System.out.println(
s.contains(new Name("Mickey", "Mouse")));
}
}
//out
false
解析:
判断两个实例是否相等,是使用equals方法进行判断的,上题中已重写了equals方法,Name的姓和名都相等则两实例相等。
s.contains(new Name("Mickey", "Mouse"))
中其实也是调用的equals,但结果却是false。
这里的bug在于Name违反了hashCode约定。Name类重写了equals方法,而hashCode约定要求相等的对象具有相同的散列码。为了遵守约定,一旦重写了equals方法,就必须重写hashCode方法。
两个对象相等,其散列值一定相同。
每日一题
输出什么?
public class Question18 {
public static void main(String[] args){
String str = new String("test");
System.out.print(str.toString());
}
}
class String {
private final java.lang.String str;
String(java.lang.String str){
this.str = str;
}
@Override
public java.lang.String toString(){
return str;
}
}