equals与==的区别简单说明
-
==
运算符:- 用于比较基本数据类型时,比较的是它们的值是否相等。
- 用于比较引用数据类型时,比较的是对象的内存地址是否相同,即是否指向同一个对象。
示例: int a = 5; int b = 5; System.out.println(a == b); // true String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1 == str2); // false,因为它们是不同的对象
-
equals
方法:equals
是一个方法,用于比较对象的内容是否相等。在Object
类中,equals
方法默认实现是使用==
比较对象的引用地址。- 很多类(如
String
、Integer
等)在它们的类定义中覆盖了equals
方法,改变了默认的行为,以比较对象的内容。
示例: String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1.equals(str2)); //true,因为它们的内容相同
总结:
==
用于比较基本数据类型时,比较的是它们的值是否相等。用于比较引用数据类型时,比较的是对象的内存地址是否相同,即是否指向同一个对象。equals.
在Object
类中,equals
方法的默认实现确实使用==
来比较对象的引用地址。因为Object
类是所有类的根类,所以默认情况下,所有类都继承了这个equals
方法。因此,如果一个类没有覆盖(override)equals
方法,它会继承Object
类的实现,该实现就是使用==
比较引用地址。但是(重点),许多类会覆盖equals
方法以提供更有意义的对象比较。例如,String
类、Integer
类等都覆盖了equals
方法,使其比较对象的内容而不仅仅是引用地址。覆盖equals
方法的目的是为了根据对象的实际内容定义相等性,而不仅仅是根据引用地址。
class MyClass {
// 如果不覆盖 equals 方法,它会使用 Object 类的默认实现
}
MyClass obj1 = new MyClass();
MyClass obj2 = obj1; // obj2 指向 obj1 的同一个对象
System.out.println(obj1.equals(obj2)); // 这里默认使用 Object 类的 equals,比较的是引用地址,返回 true