java hashCode() 和 equals() 方法的重要性?如何在Java中使用它们

时间:2018-11-14
本文章向大家介绍java hashCode() 和 equals() 方法的重要性?如何在Java中使用它们,需要的朋友可以参考一下
Java中的HashMap使用
hashCode()和equals()方法
来确定键值对的索引,
当根据键获取值的时候
也会用到这两个方法。 
如果没有正确的实现这两个方法,
两个不同的键可能会有相同的hash值,
因此可能会被集合认为是相等的。 
而且,这两个方法也用来发现重复元素,
所以这两个方法的实现对HashMap的
精确性和正确性是至关重要的。

同一个对象(没有发生过修改)
无论何时调用hashCode(),
得到的返回值必须一样。
hashCode()返回值相等,
对象不一定相等,
通过hashCode()和equals()
必须能唯一确定一个对象。
一旦重写了equals(),
就必须重写hashCode()。
而且hashCode()生成哈希值的依据应该是
equals()中用来比较是否相等的字段。
如果两个由equals()规定相等的对象
生成的hashCode不等,
对于HashMap来说,
他们可能分别映射到不同位置,
没有调用equals()比较是否相等的机会,
两个实际上相等的对象可能被插入到不同位置,
出现错误。
其他一些基于哈希方法的集合类
可能也会有这个问题。
----------------
怎么判断两个对象是相同的?
使用等号== 判断两个对象是否相同,
这种是严格的相同,
即内存中的同一个对象
 Object的equal方法就是使用==判断两个对象是否相同
------------
集合set要求元素是唯一的,怎么实现?
要实现元素的唯一,
需要在往集合set中添加元素时,
判断集合set是否存在相同的元素,
如果存在,则不添加,反之。
那么怎么确定两个元素是否相同,
1.如果是使用等号==判断两个元素是否相同,
即默认使用Object的equals的方法。
2.如果没有使用等号==判断两个元素是否相同,
而是按照某种业务规则判断两个元素是否相同,
即重写了Object的equals的方法。
----------------------
当重写equals方法,必须重写hashCode方法吗?
不是必须的,
得看具体的情况
当equals方法返回的结果和使用等号
比较的结果是一致的时候,
是没有必要重写hashCode方法。
当用等号比较对象,
只有是内存中同一个对象实例,
才会返回true,
当然调用其hashCode()方法
肯定返回相同的值,
这满足了满足了hashCode的约束条件,
所以不用重写hashCode()方法。

当equals方法返回的结果
和使用等号比较的结果是不一致的时候,
就需要重写hashCode方法。
当重写后的equals方法
不认为只有是在内存中同一个对象实例,
才返回true,
如果不重新hashCode方法()
Object的hashCode()方法 是对内存地址的映射,
hashCode方法返回的值肯定是不同的,
这违背了hashCode的约束条件,
所以必须要重新hashCode方法,
并满足对hashCode的约束条件。