Java面试中hashCode()与equals(Object obj)方法关系的准确回答

hashCode()与equals(Object obj)都是Java Object对象中的方法,也就是说Java的一切对象都提供这么两个方法。这两个方法在Java中有着不一般的联系;在Java类操作中,也起着至关重要的计算依据。

大家都知道,Java中有两大集合体系(Collection与Map),从这两个类衍生出来的实现类为大家日常使用的类(HashMap,ArrayList,LinkedList等等),而大多数集合类中判断是否增加元素使用的就是对象中的hashCode()与equals(Object obj)方法;当面试中面试官抛出(hashCode与equals方法有什么联系时),应该分情况说明

一:当对象没有重写hashCode()与equals(Object obj)方法

回答:当equals相等时,hashCode一定相等;equals不等时,hashCode一定不等 
解释:此时对象调用的Object中的hashCode与equals方法;equals比较的是内存地址,hashCode的值为内存地址的计算哈希结果值

如下为Jdk1.8 Object对象中hashCode方法的注释

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result
(中文翻译:如果两个对象根据equals(Object)方法相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果) It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results
(中文翻译:根据java.lang.Object.equals(java.lang.Object)方法,如果两个对象不相等,则不需要,因此在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果)
 
  • 1
  • 2
  • 3
  • 4
  • 5

二: 当对象重写hashCode(),保留equals(Object obj)方法

回答:当equals相等时,hashCode一定相等;equals不等时,hashCode可能相等,也可能不等 
解释:equals方法在Object对象中比较的是内存地址,equals相同则表明为同一个对象,hashCode获取的是同一个hashCode方法返回值;那为什么equals不等时,还是出现hashCode相等的情况呢? 
例子:

public class Demo {
private Integer id; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = super.hashCode();
} @Override
public int hashCode() {
return id;
} }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

当new两个Demo对象,赋值id都是1;地址不相等,但hashCode是否相等呢?

三: 当对象保留hashCode(),重写equals(Object obj)方法

回答:equals可能相等,也可能不等;hashCode一定不等 
解释:hashCode调用的是Object的hashCode方法,根据对象内存地址计算哈希值,两个内存地址不相同的对象,hashCode一定不相等;equals是否相等,取决于重写的方法怎么写。 
例子:

public class Demo {
private Integer id; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Override
public boolean equals(Object obj) {
if (obj instanceof Demo) {
Demo o = (Demo) obj;
return o.getId().intValue() == this.getId();
}
return false;
}
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

重写的equals方法实际比较的是两个对象的id值,当两个对象的Id值一致时,则equals相等

上一篇:3、Object对象的两大方法(hashCode-equals)总结


下一篇:基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题