==
是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等。默认Object类的equals方法是比较两个对象的地址,此时和==
的结果一样。换句话说:基本类型比较用==
,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法。
equals()和hashcode()的联系
hashCode()是Object类的一个方法,返回一个哈希值。如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值。
如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的。)
a.hashCode()有什么用?与a.equals(b)有什么关系
hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,使用 equal() 方法来判断两个相等的对象,必须具有相同的 hashcode。
将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合。如果hashcode相等,然后通过equal()方法判断要放入对象与集合中的任意对象是否相等:如果equal()判断不相等,直接将该元素放入集合中,否则不放入。
package StringTest;
class Dog{
}
public class EqualTest {
public static void main(String[] args) {
int a = 0; // 基本数据类型可以使用==,不能使用equals函数
Integer a1 = new Integer(0); // 基本数据类型的包装类可以使用==和equals函数
int b = 0;
Integer b1 = new Integer(0);
System.out.println(a == b); // true,基本数据类型不用创建新对象,指向常量池
System.out.println(a1 == b1); // false
System.out.println(a1.equals(b1));// true,包装类equals方法比较内部的值
Dog dog1 = new Dog();
Dog dog2 = new Dog();
System.out.println(dog1 == dog2);//false,比较两个对象,两个对象的首地址不同
System.out.println(dog1.equals(dog2));//false,未重写equals方法,比较两个对象,两个对象首地址不同
Dog dog3 = dog1;
System.out.println(dog1 == dog3);//true,同一对象
System.out.println(dog1.equals(dog3));//true,同一对象
}
}