==、equals()、hashCode()
==
==是逻辑运算符,用于判断两个对象是否相等,无论基本数据类型还是引用类型,它比较的都是对象是否相等或者说地址是否相等。
equals()
equals()是Object类中的方法,用于比较两个对象是否相等。
Object类中的equals()方法使用==实现的,也就是说使用equals()与使用 == 的效果是一样的。
但是对于引用类型,当 == 比较的地址不相同时并不代表对象内容不同,此时我们就需要重写equals()方法来自定义比较算法。
需要注意的是,String类已经为我们重写了equals()方法,所以可以直接使用equals()来比较两个String。
HashCode
什么是HashCode?
HashCode中文名称是散列码,HashCode是根据特定的算法对每个对象生成的唯一的值。
主要用于在HashMap、HashSet等哈希表中快速定位元素以及确保元素的唯一性。
hashCode()与equals()
hashCode()是native方法,使用C或C++实现的。
equals()是用来确定元素是否相等的。
hashCode()与equals()都是Object类中的方法,也就是说所有的类中都有这两个方法。
一般我们重写equals()方法时也要重写hashCode()方法。
确定两个对象相等时,它们的HashCode也必须相等。一个好的判断HashCode的算法应该确保对象的HashCode均匀分布,尽量减少哈希冲突的现象(所谓哈希冲突,就是两个不同的对象取得了相同的HashCode)。也就是说对于两个对象:
- hashCode()相等时不一定相等,还要equals()相等才能确定相等
- equals()相等时,一定要确保hashCode()也相等
- hashCode()不相等时就可以确定两个对象不相等
在HashSet中,我们需要保证元素的唯一性,对于一个元素,我们需要通过hashCode()来获取其HashCode,如果没有其它元素的HashCode与其相等,就将这个元素添加进HashSet中,如果有其它元素与其HashCode相等,此时由于可能会出现哈希冲突的问题,还不能确定元素是否相同,需要使用equals()方法再次比较,equals()与hashCode()都相等时才能确定两个元素相等,就不能将该元素加入HashSet中。