在java中,当一个对象需要存放在集合对象中时,就需要重写equals和hashCode方法,尤其是hash类的集合(HashSet、hashmap等),那么为什么需要重写equals和hashcode两个方法呢?
java中规定两个对象equals相等则hashcode肯定相等,由于java中的所有对象均继承子Object类,故Sun JDK中在Object类里面定义了equals方法和hashcode方法.打开JDK源码:
public boolean equals(Object obj) {
return (this == obj);
}
public native int hashCode();
可以看到在Object中,equals默认按对象的地址进行比较,而hashcode干脆采用了native声明,故如果我们不进行重写,当向hash集合中存放入我们自定义对象作为的key,然后再new同样的key就取不出相应的value(因为两个对象的地址不同,排除单例模式),这样就达不到我们预先的需求,所以我们应该为自己的自定义类重写equals和hashcode方法。
那么怎样重写equals和hashcode方法?
对于equals方法的重写,此处不再赘述,而hashcode方法的重写需要说明一下啊。
对于hashcode方法的重写,可以采用自定义类的某个属性进行重写,但最好不要是id属性;在effective Java一书中提到一下几个步骤:
1.给某个int型变量result赋上一个非零常量
2.为对象中某个有意义的属性计算出出一个hash码c
3.合并计算得到的散列码,如:
result = 37*result+c
4.返回result
5.检查hashCode()最后生成的结果,确保相同的对象有相同的散列码
以上就是对equals和hashcode使用方式的初略得不能再初略的分析,第一次发博,肯定写的不是很好,还请大牛们不要见怪!!!以后会及时更细一些自己学习当中有意义的心得,恳请大家赐教!!!