equals方法比较的是两个对象的哈希码,这么说对吗?

来源:百度知道 编辑:UC知道 时间:2024/06/22 04:42:23
如题

没有绝对的对错,如果你重装equals方法,让他去比较两个对象的哈希码来决定两个对象是否相同的话,那这么说就是对的了。否则的话是不能这么说的。

equals在原则上要和hashcode保持一致,即equals为真 两个对象hashcode应相同。 你之所以产生这个想法我想估计就这这样造成的。两个方法结果的一致性让你误以为是equals比较的是hashcode。

而在程序中真正的hashcode是和内存地址有关的,所以你可以想象每个对象的hashcode是不可能相同的,两个不一样的对象不能同时在一个内存地址上,这个肯定确保了不同对象的hashcod不同。
但是在实际运行中我们判断对象是否相同不需要那么严格,两个字符串内容一样我们就认为是相等了,而不去看他是不是在同一个内存地址上,所以这个时候我们就要重新写这个equals来达到当内容相同就返回true了,而不去管内存地址是不是一样了。。但是在很多map这类容器中判断对象是否相等则是同时比较equals和hashcode,所以为了保证这些重载过equals方法的类还能在这种情况下正常使用就规定了重载equals就一定要重载hashcode。这个也是为什么要求equals和hashcode一致性的原因。

equals比较的变量实际的值,双等号(==)比较的是内存地址~内存一样当然值也是一样的~!!

你看看Object的equals方法就知道了,如下:
public boolean equals(Object obj) {
return (this == obj);
}
它比较的是当前对象与所传入对象的引用的地址,所以你的问题不言而明了,它的后继类一般都会重写这个方法:如String类:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;