-
默认的hashCode()方法是什么?
根据对象内存地址经过哈希算法转换成一个数字,可以等同看做内存地址。
-
重写后希望它变成什么?
-
为什么重写equals方法,一定要重写hashCode()方法?
(1)当只重写前者:重写后的equals方法和默认的hashCode()方法矛盾
(2)
重写前: 前者:默认比较两对象的内存地址。
后者:默认比较两对象的哈希值(内存地址根据哈希算法得来的值)。
public native int hashCode(); //native关键字:它的源码是C++实现的,文章下面有参考文献,
重写后:
前者:比较两对象的内容。
后者:返回一个值(这个值是根据对象属性来计算的。也就是说,根据对象属性的值,返回一个唯一的值)
public int hashcode(){ final int prime = 31; int result = 1; result = prime*result + age; //name是string类型,也就是调用String类默认的hashcode()方法。所以:name.hashcode()就是name对象的哈希值 result = prime*result + (name == null? 0 : name.hashcode()); return result;//直接写age+(name == null? 0 : name.hashcode())也行就是感觉太简单了0.0 }
-
根据hashcode的规则,两个对象相等其哈希值一定相等,所以矛盾就产生了,因此重写equals一定要重写hashcode
-
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,当然你也可以重写它,hashcode方法只有在集合中用到。
-
对象放入集合中时,先判断hashcode是否相等,再判断equals是否相等,都相等就算是同一个对象,list则可以放入,set因为不允许重复所以不会放入。
参考:1. https://blog.csdn.net/yjclsx/article/details/50975926
2. https://blog.csdn.net/bifuguo/article/details/81513526?ops_request_misc=%7B%22request%5Fid%22%3A%22163187177616780265431284%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&request_id=163187177616780265431284&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-81513526.pc_search_result_control_group&utm_term=native&spm=1018.2226.3001.4187