equals 和 “==” 的区别
“==” 和 equals 最大的区别是:
- “==” 是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
- equals 是 Object 的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
一、“==”
“==” 是运算符
- 如果比较的对象是基本数据类型,则比较的是其存储的值是否相等;
- 如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。
二、例子解释和说明
public class Demo {
public static void main(String[] args) {
// 基本数据类型的比较
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); // 结果为:true
// 引用数据类型比较
String str1 = "hello java";
String str2 = "hello java";
System.out.println(str1 == str2); // 结果为:true
String s1 = new String("hello java");
String s2 = new String("hello java");
System.out.println(s1 == s2); // 结果为 false
}
}
在上面的例子中我们发现,前两个例子的比较结果都为 true,但是最后一个例子的比较为 false。那为什么值一样但是使用 “==” 比较的时候有的为 true,而有的为 false?
解释(先看图):
我们可以看到:
-
基本数据类型使用 “==” 比较时,比较的是值是否相等;
-
在没有 new 情况下,引用数据类型比较时,先是在常量池中寻找是否存在这个常量,如果不存在,先在常量池中创建这个常量,并赋予地址,然后引用地址值;如果存在,则直接引用该地址值。
-
在 new 的情况下,返回的是堆中创建的对象的地址值;每 new 一个对象,就会在堆中开辟一个新的空间来存储对象。
三、equals
equals 是 Object 的方法,用来比较两个对象的地址值是否相等。
注意:
- equals 方法不能用于比较基本数据类型,如果没有对 equals 方法进行重写,则相当于 “==” ,比较的是引用类型的变量所指向的对象的地址值。
- 一般情况下,类会重写 equals 方法用来比较两个对象的内容是否相等。比如 String 类中的 equals() 是被重写了,比较的是对象的值。
四、例子解释和说明
public class Demo {
public static void main(String[] args) {
// 基本数据类型的比较
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); // 结果为:true
// 引用数据类型比较
String str1 = "hello java";
String str2 = "hello java";
System.out.println(str1 == str2); // 结果为:true,比较的是地址值
System.out.println(str1.equals(str2)); // 结果为:true,比较的是内容
String s1 = new String("hello java");
String s2 = new String("hello java");
System.out.println(s1 == s2); // 结果为 false,比较的是地址值
System.out.println(s1.equals(s2)); // 结果为:true,比较的是内容
// 没有重写 equals 方法的类中 == 与 equals 的比较
People p1 = new People();
People p2 = new People();
People p = p2;
System.out.println(p1); // People@5cad8086
System.out.println(p2); // People@6e0be858
System.out.println(p); // People@6e0be858
System.out.println(p1.equals(p2)); // false,p1 和 p2 的地址值不同
System.out.println(p.equals(p2)); // true,p 和 p2 的地址值相同
}
}
class People{
}
我们通过例子可以看出,equals 在 String 类中重写之后,比较的是值是否相同;equals 在没被重写时比较的是地址值,同 “==” 一样。