equals方法和HashCode方法
参考:java中为什么要重写hashCode和equals?
Hash
把任意长度的输入通过散列算法变换成固定长度的输出。或者说是一种将任意长度的消息压缩到某一个固定长度的消息摘要的函数。
散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,难以找到逆向规律。当原有文件发生变化时,其标志值也会发生改变。
hash值相等,key值不一定相等;hash值不相等,那么key值一定不相等。
key值相等,hash值一定相等
HashCode
HashCode是Object的一个方法,hashcode方法返回一个hash code值。
- 减少查找次数,提高程序效率
- hashcode方法主要是为了配合基于散列的集合使用(集合中不允许重复元素的存在)。
当集合要添加新的对象时,先调用这个对象的hashcode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较。如果存在该hashcode值,就调用它的equals方法进行比较。
equals和==区别
在string,int中都重写了object类中的equals方法,在object中只是利用==判断,判断对象的地址是否相等。
在string中先用==判断了,然后判断是否为string类,然后进行每个字符的比较。int中也类似。
注:equals相等,则hashcode值必相等;hashcode值相等,equals不一定相等
重写equals方法时为何要重写hashCode方法
- equals和hashcode的关系
equals方法时严格比较两个对象是否相等,即比较内存地址。
如果两个对象相等(equals相等),那么hashcode值一定相等。
如果hashcode值相等,两个对象不一定相等。
如果hashcode值不相等,那么两个对象一定不相等。
如果对象不相等,hashcode值有可能相等。
- 重写equals方法的需求
在业务中我们有时候并不需要严格的内存地址相等,而是比较对象的内容或者某一个属性是否相等,来判断对象是否相等。
- 重写equals方法后为何需要重写hashcode方法
如果在equals方法重写后,只是判断对象中一个属性相等就认为两个对象相等,那么不重写hashcode就不能满足以下约束:两个对象相等,hashcode值一定相等。
两者是相辅相成的。在集合中添加元素判断是否重复时,如果直接用equals方法判断,效率太低,需要一个个进行判断,如果用hashcode方法判断,如果hash值对应位置为空,那么就一定没有重复,如果当前位置有元素,再用equals方法判断。