一、equals()的作用
equals()定义在java.lang.Object包下,它的作用是判断两个对象是否相等,方式是通过比较这两个对象的地址是否相等。相等返回true,不相等返回false。
有的时候,Object的子类会重写equals()方法。
通常是两个对象的内容相等,则返回true;否则返回false。比如String类下面的equals()方法。
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
二、equals()方法和==的区别是什么?
== : 1、用于基本数据类型的比较,只是比较它们的值是否相等;
2、用于引用数据类型的比较,是比较它们的地址是否相等
equals():该方法只能用于对象之间的比较
1、在对象没有重写该方法时,等价于==运算符,即比较地址
2、类覆盖了equals()方法。一般,我们都覆盖equals()方法比较两个对象的内容相等
三、hashCode()的作用
hashCode()的作用是**获取哈希码**,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。
hashCode()用于散列表之中。在散列表中hashCode()的作用是获取该对象的散列表,进而确定该对象在散列表中的位置。
四、hashCode()和equals()方法的关系
1、第一种 不会创建"类对应的散列表"
这里所说的不会创建"类对应的散列表"是说:我们不会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,不会创建该类的HashSet集合。
在这种情况下,该类的"hashCode() 和 equals() "没有关系
这种情况下,equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用,所以,不用理会hashCode()。
2、第二种 会创建"类对应的散列表"
这里所说的“会创建"类对应的散列表"是说:我们会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,会创建该类的HashSet集合。
在这种情况下,该类的"hashCode() 和 equals() "是有关系的:
1)、如果两个对象相等,那么它们的hashCode()值一定相同。这里的相等是指,通过equals()比较两个对象时返回true.
2)、如果两个对象hashCode()相等,它们并不一定相等。因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。
所以在第二种情况下,要判断两个对象是否相等,除了要覆盖equals()方法之外,也要覆盖hashCode()方法。