标签:利用 set 情况 equals 调用 返回 存储 定义 自己
public boolean equals(Object obj)
对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;
假如自定义一个类,如果不重写equals,由于Object类是所有类的父类,调用equals时判断的是对象的引用是否指向同一块内存地址,而重写的目的是为了比较两个对象的value值是否相等。
此方法返回对象的哈希码值,什么是哈希码?
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。
当你把对象加? HashSet时,HashSet 会先计算对象的 hashcode 值来判断对象加?的位置,同时也会与该位置其他已经加?的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。
但是如果发现有相同 hashcode 值的对象,这时会调? equals() ?法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加?操作成功。如果不同的话,就会重新散列到其他位置。
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode
那么我们当再new一个新的对象时,当原对象.equals(新对象)等于true时,此时两者的hashcode却是不一样的,这就会出现以下问题:
当我们把这个对象加入到存储散列集合中时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode()
标签:利用 set 情况 equals 调用 返回 存储 定义 自己
原文地址:https://www.cnblogs.com/qiuzhou/p/13965640.html