equals和hashCode
hashCode和equals都是Object中的两个方法,那么他们有什么区别和联系呢?
首先,equals和hashCode两个方法在Object中是有不同的定位的。
我们看javadoc中的描述:equals是知识某个对象是否与次对象”相等”;hashCode返回对象的哈希码值,hashcode方法是为了提高哈希表的性能。
equals方法的实现要求满足自反性,对称性,传递性,和一致性,并且要求对非空引用的值和null判断都应该返回false。
hashCode是为了提高哈希表的性能,所以hashcode有些常规的协定。如果根据equals方法两个对象是相等的,那么这两个对象中的hashcode方法生成同样的整数结果,反过来两个对象不相等,不要求hashcode一定不同,但是我们应该认识到,为不同的对象生成不同的hashcode值,可以提高哈希表的性能。
那么hashcode是如何提高哈希表的性能的呢?在java中,hashMap,hashSet等都是通过哈希表来实现的。比如说hashSet,set集合中的元素是无序不可重复的。如果我们在HashSet中插入数据,怎么保证不会重复呢?难道我们迭代集合中的每一个对象调用equals比较吗?
HashSet中是通过HashMap来实现的,是通过hashcode定义到对应的散列分区合,比较对应的hashcode,如果不同则添加,否则调用equals比较。所以hashcode在其中扮演的是定位和寻域的作用。
所以我们在重写equals方法的时候必须重写hashCode的方法,并且需要满足hashCode的常规协定。
具体重写的方法,commons的lang包中,HashCodeBuilder和equalsBuilder中提供了协助。
另外需要注意是,我们在ORM框架中实现重新equals和hashCode时使用get方法,因为在一些ORM框架中采用来了懒加载,只有在调用get方法时候才回去执行。