java的Object对象equals方法和hashcode方法的区别和联系

java的Object对象equals方法和hashcode方法的区别和联系首先看看这两个方法是干啥的 equals 是用来判断两个对象是否相同 他和 是一样的 默认比较对象的引用 子类一般都需要重写该方法 当重写后 他就个 比较不一样了 两者区别如下 1 对于基本数据类型 只

大家好,欢迎来到IT知识分享网。

首先看看这两个方法是干啥的:

equals:

是用来判断两个对象是否相同,他和 ==是一样的,默认比较对象的引用,子类一般都需要重写该方法。当重写后,他就个”==”比较不一样了。两者区别如下:

1.“==”对于基本数据类型,只要值相等,就返回true,否则返回false。若比较的为对象,则判断的是两个对象是否处于同一个内存地址。

2.equals为Object类中的方法,Object中equals默认使用==来判断,因此一般来讲equals与“==”并无区别,完全相同。Object是所有类的父类,在不少类中都对equals进行了重写,比如最常用的String类,因此在String中比较的是值,而非地址。基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的

  • 为什么要重写equals:

因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

下面以String为例看看源码的重写:

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
java的Object对象equals方法和hashcode方法的区别和联系

我们看到红框就是具体的自定义String中的值比较。接下来我们看看hashcode

hashcode

计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),因此每个Object对象的hashCode都是唯一的,当然如果对应的类重写了hashcode方法就会不一定唯一了,这是重写方法的问题了。

  • 为什么会有hashcode

上面提到了每个object和hashcode都是唯一的(不重写的情况下),所以在批量处理对象比较时,如果采用equals方法并且这个还是自己重写的,要一一比较具体的属性,就会狠耗时,此时直接用hashcode比较先做个简单判断就会省时很多,具体规则会用在某些集合中:

1:如果hashCode()相等,则查看第二步,否则不相等;
2:查看equals()是否相等,如果相等,则两obj相等否 则还是不相等。

改写equals时总是要改写hashcode,java.lnag.Object中对hashCode的约定:

1.在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。(而这个hashcode肯定是根据equals比较所用到的信息生成的)

2.如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。

3.如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

如果改写String中的equals为基于内容上的比较而不是内存地址的话,那么虽然equals相等,但并不代表内存地址相等,由hashcode方法的定义可知内存地址不同,没改写的hashcode值也可能不同。又如new一个对象,再new一个内容相等的对象,调用equals方法返回的true,但他们的hashcode值不同,将两个对象存入HashSet中,会使得其中包含两个相等的对象,因为是先检索hashcode值,不等的情况下才会去比较equals方法的。

由上得出:

  • equals()相等的两个对象,hashcode()一定相等
  • hashcode()不等,一定能推出equals()也不等
  • hashcode()相等,equals()可能相等,也可能不等。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/98526.html

(0)
上一篇 2026-03-05 10:45
下一篇 2026-03-06 17:27

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信