1. 本质区别
-
== 是一个运算符,它用于比较两个变量的值是否相等。
-
equals 是 object类中的一个方法,它用于比较两个对象的内容是否相等。
2. 比较对象的区别
-
对于基本数据类型来说, == 比较的是值。
-
对于引用数据类型来说,== 比较的是对象的内存地址。
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变 量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
equals() 不能用于判断 基本数据类型的变量,只能用来判断 两个对象是否相等。
equals() 方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。
3. equals()的其他知识
1. Object 类 equals() 方法:
public boolean equals(Object obj) {
return (this == obj);
}
equals() 方法的两种使用情况:
-
类没有重写 equals()方法:通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Object类 equals() 方法。
-
类重写了 equals()方法:一般我们都重写 equals() 方法来比较两个对象中的属性的值是否相等;若它们的属性的值相等,则返回 true(即,认为这两个对象相等)。
2. 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;
}
具体例子:
public static void main(String[] args) {
String s1 = "1"; // 引用一个字符串常量池
String s2 = "1"; // 引用一个字符串常量池
String s3 = new String("1");// 申请一个空间
String s4 = new String("1");// 另外申请一个空间
double d1 = 1.0;
double d2 = 1;
int i = 1;
int j = 1;
System.out.println(s1 == s2); //true 比较的是引用地址
System.out.println(s1 == s3); //false 比较的是引用地址
System.out.println(s1.equals(s3)); //true 比较的是对象的值
System.out.println(s3 == s4); //false 比较的是引用地址
System.out.println(s3.equals(s4)); //true 比较的是对象的值
System.out.println(d1 == d2); //true 比较的是值(基础数据类型)
}