章
目
录
在Java编程中,==
和 equals
都是用来比较对象的操作符,但它们在比较对象时有着不同的用途和行为。理解它们之间的区别对于正确地比较对象是至关重要的。
1. == 操作符
在使用 == 进行比较时,其作用效果是不同的,可以总结如下:
基本类型:在进行基本类型的比较时,实际上是在比较它们的值是否相同。如果两个基本类型的值相等,那么它们会被判定为相等。
引用类型:对于引用类型,比如对象或者数组,使用 == 进行比较时,实际上是在比较它们的引用是否相同。也就是说,如果两个引用类型变量引用了同一个对象或数组,那么它们会被认为是相等的。
示例代码:
String x = "hello";
String y = "hello";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
原因解析
因为 x 和 y 指向的是同一个“hello”字符串地址引用,因为类似String x=”hello”;这个语句的含义,是在运行时的常量池中赋值,相同的字符串只会分配一次,第二次是将内存池中这个指向该对象的引用返回,所以x和y其实是指向同一个内存地址,所以 == 返回 true,而 new String()方法则重写创建了内存空间,内存地址不一样,所以 == 返回为 false,而 equals 比较的一直是值,他们的值都是字符串“hello”,所以结果都返回为 true。
2. equals 方法
equals
方法是定义在 Object
类中的方法,用于比较两个对象的内容是否相等。默认情况下,equals
方法使用的是和 ==
相同的引用比较,但许多类会重写 equals
方法,使其根据对象的内容来进行比较。
对于 equals
方法,实际上它本质上是 ==
运算符,但某些类如 String 和 Integer 为了实现特定的功能,重写了 equals
方法,将其转变为值的比较。通过下面的代码示例,我们可以更好地理解这个概念。
首先,我们来看一个默认情况下使用 equals
方法来比较具有相同值的对象的代码:
class Person {
public Cat(String name) {
this.name = name;
}
private String name;
}
Person c1 = new Person ("小明");
Person c2 = new Person ("小明");
System.out.println(c1.equals(c2)); // false
输出结果出乎我们的意料,竟然是 false?这是怎么回事,看下 equals 源码就明白了,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
原因就在于 equals 本质上就是 ==,那问题来了,两个相同值的 String 对象,为什么equals返回的是 true?代码如下:
String s1 = new String("小明");
String s2 = new String("小明");
System.out.println(s1.equals(s2)); // true
同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:
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;
}
原来是 String 类重写了 Object 的 equals 方法,把引用比较改成了值比较,因此就返回了true。
总结
总体而言,在Java中,==
运算符在处理基本类型时进行值比较,在处理引用类型时进行引用比较。而 equals
方法在默认情况下执行引用比较,但许多类(例如 String 和 Integer)已经重写了 equals
方法,使其变为值比较。因此,通常情况下,equals
方法用于比较值是否相等。