为什么重写equals 时候,必须重写hascode

public class t {
	public static void main(String[] args) {
		HashMap map12 = new HashMap();
		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个变量即可

你可能感兴趣的:(java后台)