public class t {
public static void main(String[] args) {
HashMap<Object, Object> map12 = new HashMap<Object, Object>();
Student sa = new Student("123", "345");
Student sb = new Student("123", "345");
System.out.println(sa.equals(sb));
map12.put(sa, "sa");
map12.put(sb, "sb");
System.out.println(map12);
}
}
class Student{
public Student(String _name , String _id ){
name = _name;
id = _id;
}
String name ;
String id;
@Override
public boolean equals(Object obj) {
if(obj instanceof Student){
if(((Student) obj).name.equals(name) && ((Student) obj).id.equals(id)){
return true;
}
}
return false;
}
// @Override
// public int hashCode() {
//
// return name.hashCode()+id.hashCode();
// }
}
当重写hashCode代码注掉的时候
输出结果
true
{com.tocel.framework.server.socket.Student@73a80183=sb, com.tocel.framework.server.socket.Student@79f1d448=sa}
当解开注释之后
输出结果
true
{com.tocel.framework.server.socket.Student@18426=sb}
因为,例如hashmap 在put 的时候,会比较2个变量的hashcode来判断是否相同,只有在hash碰撞的时候,才会执行equals方法,所以,最好是重写equals的时候要重写hashcode方法。
如何书写呢:
当你equals比较的是2个变量,那么hashcode比较也要比较这2个变量即可