equals和hashcode的关系。

2024-12-04 16:15:43
推荐回答(4个)
回答1:

只是为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同.

equals()和hashCode()都来自java.lang.Object.你当然可以重写.

比如a.equals(b).仅当a的内存地址相等时,才返回true.当然如String等类已经对这个方法进行了重写,比较的就不再是内存地址了.

hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等.同样很多类也重写了这个方法,还是以String为例:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
就不在与内存地址相关了.这样做是为了保证用equals比较返回为true的两个对象,他们的hashCode是相同的.

所以一般重写equals的时候都会重写hashCode().

当然,这个相当于一个约定,一个协议.你不这么做并不会错.

回答2:

1、如果两个对象相同(equals),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(equals)

回答3:

没关系,两个不同的方法而已,有些对象会用hashcode来判断是否equals

回答4:

  只是为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同。
  equals()和hashCode()都来自java.lang.Object.你当然可以重写。
  比如a.equals(b).仅当a的内存地址相等时,才返回true.当然如String等类已经对这个方法进行了重写,比较的就不再是内存地址了。
  hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等.同样很多类也重写了这个方法,还是以String为例:
  public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
  就不在与内存地址相关了.这样做是为了保证用equals比较返回为true的两个对象,其中的hashCode是相同的。
所以一般重写equals的时候都会重写hashCode()。