一、==
在 Java 中,==
操作符用于比较两个变量的值是否相等。然而,它的行为取决于被比较的变量的类型:
- 基本数据类型:对于基本数据类型(如
int
、double
、char
、boolean
等),==
操作符比较的是值。如果两个变量存储的值相同,那么==
操作符返回true
。 - 引用数据类型:对于引用数据类型(如类、接口、数组等),
==
操作符比较的是两个引用变量是否指向内存中的同一个地址,即它们是否引用同一个对象。如果两个引用指向同一个对象,那么==
操作符返回true
。 - 如果两个引用指向不同的对象,即使这些对象的内容相同,
==
操作符也会返回false
。
对于字符串和一些其他特殊的对象,Java 有特殊的规则:
-
字符串:当使用
==
比较两个字符串字面量时,实际上是比较它们的内存地址,因为字符串字面量在 Java 中是存储在字符串池中的。但是,如果字符串是动态创建的,比较的也是对象的引用。String s1 = "Hello"; String s2 = "Hello"; System.out.println(s1 == s2); // 输出 true,因为它们引用字符串池中的同一个对象 String s3 = new String("Hello"); String s4 = new String("Hello"); System.out.println(s3 == s4); // 输出 false,因为它们是两个不同的对象
-
包装类:对于包装类(如
Integer
、Double
等),在-128
到127
之间(对于Integer
)的值,Java 会使用缓存的对象,所以在这个范围内的包装类使用==
比较可能会返回true
。但是,超出这个范围的值,即使数值相同,也会是不同的对象。Integer i1 = 100; Integer i2 = 100; System.out.println(i1 == i2); // 输出 true,因为它们引用的是缓存的对象 Integer i3 = 128; Integer i4 = 128; System.out.println(i3 == i4); // 输出 false,因为它们是两个不同的对象 Integer num3 = new Integer("100"); Integer num4 = new Integer("100"); System.out.println(num4 == num3); // 输出 false,因为它们是两个不同的对象
在比较对象是否相等时,通常建议使用 equals()
方法,因为它可以比较对象的内容是否相等,而不仅仅是它们的引用。然而,需要注意的是,equals()
方法的行为取决于它的实现,不同的类可能会有不同的 equals()
方法实现。
二、equals
equals是object类中的一个方法,它本身默认实现是比较传入对象的地址值和当前对象的地址值是否相等。
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
对于equals方法,不同的类有不同的实现,如String和Integer都有自己的实现。
-
String类中实现如下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
-
Integer类的实现如下:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
在比较Integer类型数据比较时,推荐使用equals进行比较。
在自己的实体类中也可以覆写equals方法,自定义equals的比较方式。