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、一般不需要重写。