为什么重写equals时必须要重写hashcode??
- 为什么需要重写equasl方法???
- 为什么类重写equals时必须重写hashcode??
- 通过hashcode和equals搭配比较对象是否相等,是如何提高效率的???
为什么需要重写equasl方法???
equasl()方法是Object中的方法,用于判断两个对象是否相等
public boolean equals(Object obj ) {
return ( this == obj );
}
我们如果想通过该方法来判断对象是否相等,那么需要重写;
当然,不重写也可以判断对象是否相等,但是这样没有意义!!!因为不重写比较的对象地址,同一个对象,地址肯定一样呀!!
我们所说的对象相等,是指两个对象的内容一样!!!
为什么类重写equals时必须重写hashcode??
hashcode()方法默认是本地方法,返回的是对象地址的10进制数表示!!
(1) 如果不重写,那么会导致该类无法结合所有基于散列的集合一起正常工作,比如hashset,hashmap等
这里拿hashset举例
hashset是不重复的,那么他是怎么判断是否重复的呢??
就是通过hashcode和equasl方法结合来判断的!!!
假如我们只重写了equals方法,那么在添加s3时,会进入if判断时,遍历entry数组,查找是否有相等的hashcode;
由于s1和s3是不同的对象,因此他们的hashcode不等,从而走下面的addEntry()把s3添加进set集合
这样就导致set失去了他不重复的特性!!
(2)还会违反Object.hashcode的通用规定!!!
为什么不重写就会违反呢???
student s1 = new student("zhangsan",18);
student s2 = new student("zhangsan",18);
这里重写equals方法后,判断s1.equasl(s2)为true,
但是我们没有重写hashcode,那么就会比较两个对象地址是否相等,显然这两个对象地址不等!!
违反了其中的一条是:
如果两个对象根据equals方法比较是相等的,那么两个对象调用hashcode的值也相等!!
通过hashcode和equals搭配比较对象是否相等,是如何提高效率的???
hashset的put方法就是如此!!