为什么通常会重写Hashcode方法?
近在面试的时候,当问完了HashMap的数据结构之后,通常会再多问一个问题,就是:重写equals方法时通常为什么也要重写一下hashcode方法? 其实这个问题,本质上又回到HashMap的应用场景了,就是想看一下面试者是否真的融会贯通。今天这篇文章就带大家了解一下equals方法和hashcode方法之间的关系,以及相关的知识点。 equals与hashcode的存在其实每个类都有一个equals方法和hashcode观上可以看到equals方法默认比较的是对象的引用,直接用“==”进行比较。而hashCode方法是一个native方法,返回值为整型。 而这两个方法都未被final修饰,都是可以进行重写的。 对于我们经常使用的比如String 、Math、Integer、Double等类,都进行了equals()和hashCode()方法的重写。 equals()方法equals()方法是用来判断两个对象是否相等。Object默认实现了equals方法,但很明显不太符合个性化的需求,因此往往需要进行重写。比如常用的String类,重写的equals方法如下: 的比较已不再是单纯的地址比较了。首先通过地址进行比较,如果地址相同那么肯定是相同的对象。如果地址不同就再拿char数组的内容进行比较,完全相等则返回true。 equals()方法的特质在Object类的equals方法上有注释说明了equals()方法需满足的一些特性:
对照上面特质,我们发现Object方法直接比较的是两个引用地址,只有两个地址相同才相等,也就是说是差别可能性最大的等价关系。 而String的equals方法,不仅包含应用地址相同这种情况,还包括里面所存储的字符串值相同的情况。也就是说虽然是两个String对象,但是它们的字符串值相等,那么equals方法返回的结果就是true。这也正是大多数情况下我们所说的“equals方法比较的是值”。
由于Object的equals方法的默认特例存在,因此在没有自定义equals方法时,我们不能一概的说equals方法比较的是具体的值,而“==”比较的是引用。 (编辑:吉安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |