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个变量即可