a == b
和 a.equals(b)
在Java(以及许多其他面向对象编程语言中)用于比较两个对象或值,但它们之间存在本质的区别,这主要取决于它们所比较的对象类型:
-
a == b
:- 这是一种基本类型比较或对象引用比较。
- 如果
a
和b
是基本数据类型(如int
、float
、char
等),那么a == b
会比较它们的值是否相等。 - 如果
a
和b
是对象引用(即它们指向堆内存中的对象),那么a == b
会比较这两个引用是否指向内存中的同一个对象(即它们的内存地址是否相同)。
-
a.equals(b)
:- 这是一个方法调用,用于比较两个对象的内容是否相等。
- 默认情况下,
Object
类中的equals
方法比较的是对象的引用(即和==
在对象引用比较时相同)。但是,许多类(如String
、Integer
等)都重写了equals
方法,以提供基于对象内容的比较。 - 因此,当你使用
a.equals(b)
时,如果a
和b
不是同一个类的实例,或者这个类没有重写equals
方法,则可能会抛出ClassCastException
(如果equals
方法没有被正确重写以处理不同类的情况)或仅基于引用进行比较(如果equals
方法未被重写)。 - 重要的是要注意,
equals
方法通常要求传入的对象不为null
,否则可能会抛出NullPointerException
。因此,在使用equals
方法之前,最好先检查对象是否为null
。
示例:
String a = new String("hello");
String b = new String("hello");
// 使用 == 比较对象引用
System.out.println(a == b