• 目录

equals()和hashCode()

阅读量: 210 编辑

equals() 和 hashCode()

是Object类中两个重要的方法。所以,所有子类都有这两个方法,也都可以重写。

public boolean equals(Object obj)
public int hashCode()

1、equals()

equals() 一般用于比较对象的内容是否相同,但是比较起来比较复杂,效率很低

所以会先用 hashCode 进行比较,只要比较一个整数值是否相同,如果不同,再用 equals 比较。这样效率会提高很多。但是 hashCode 并不可靠。

2、hashCode()

在Java中,比如将对象放到 Set 集合中,是需要保证数据是唯一的。

那么当放入数据的时候,是先比较对象的 hashCode 的值,可以理解 hashCode 就是这个对象的 “整数编号” 内存地址,比较效率很高

如果这个地址上没有数据,那么就把这个对象放进去,即可。

如果这个地址中有数据,那么再通过 equals 来比较是否相同。如果相同,那么就不用放了。如果不同,再找下一个地址,放进去即可。

3、所以得出

  • 1、在对象的比较上,hashCode 并不可靠,需要 equals 配合使用。

  • 2、如果两个对象的 hashCode 相同,他们并不一定相同(equals)。

  • 3、如果两个对象相同(equals),那么它们的 hashCode 值一定相同。

  • 4、但是先用 hashCode 比较,如果不同,再用equals比较,这样可以大大提高运算效率。

  • 5、只要重写了 equals ,一般都要重写 hashCode。特别是用 Set 存储对象的时候,必须都重写。

  • 6、如果自定义的对象是Map的键,equals 和 hashCode 都必须重写。

  • 7、当对象结合 HashSet、HashMap、HashTable 使用的时候,会用到 hash 结构,都需要重写。

  • 8、一般不需要重写。

  • 目录