你真的了解 equals 方法吗?
equals() & hashCode()
i. 首先,简单介绍一下具体用法
boolean equals(Object obj) - 用于判断调用对象是否与参数对象相等
若希望比较对象的内容,则需要进行方法的重写
若该方法重写了,则应该去重写 hashCode()方法,以维护 hashCode 方法的常规协定
int hashCode() - 用于获取调用对象的哈希码值(内存地址和编号)并返回
若两个对象调用 equals()方法相等,则各自调用该方法得到的哈希码值必须相同
若两个对象调用 equals()方法不相等,则各自调用该方法的结果可以相同,但是最好不相同
ii. 一个案例带你搞懂 equals() 和 hashCode()
首先,我们创建一个 Student 类
在 TestStudent 类中进行测试
显然,因为 equals 方法默认比较的是地址,这里 s1 与 s2 地址不同,输出为 false。那么,如果我们想要另两个对象学号相同时,使用 equals 方法时输出为 true 应该怎么做呢,很显然,equals 方法是属于 Object 类的,那么我们只要在 Student 类中对其进行重写即可
这里,我们对 4 中情况进行了考虑,我们再次运行 TestStudent 代码,发现此时输入了 true,因为当我们重写 equals 方法后,则调用子类重写以后的版本,比较内容。
在这里,我们会想到 String 类,那么我们对 String 对象调用 equals 方法会输出什么呢?
这里输出的是 true,我们知道这是两个 String 对象,输出不应该是 false 吗?根据前面所讲的,我们明白了,原来 , 那么我们就明白了。到这里就完了吗?不,还没有,前面我们说过,一般为了维护 hashCode 方法的常规协定,我们要在 Student 类中重写 hashCode 方法
我们在 TestStudent 类中进行测试
这里就达到了我们想要的结果,你 Get 到了吗?
喜欢就关注博主吧,你的关注点赞是对博主最大的鼓励!:smile:
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/985c3c301817b4b04f0ab6f7d】。文章转载请联系作者。
评论