在Java中任何一个对象都具备hashCode()方法和equals(Object obj)方法。
- equals(Object obj)方法是用来判断两个对象是否相同,相同就返回true,不相同就返回false。
- hashCode()方法返回一个int数值。
JDK对hashCode()方法和equals()方法有一定的规范:
- 若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
- 如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
根据这两个规范,可以得到如下推论:
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
我们可以通过调用对象的hashCode()方法来生成hashCode值。因为两个不同的对象调用hashCode()方法生成的哈希值有可能一样,所以不能通过哈希值相等来判断两个对象相等。