1.什么是" == "?
java编程思想这本书中有这样一句话:"关系操作符生成的是一个boolean结果,他们计算的是操作数的值之间的关系"。也就是说: " == " 用来比较值是否相等,要比较两个基本类型的数据和引用变量是否相等,只能用"=="操作符。
public static void main(String[] args) {
int a = 4;
int b = 4;
String str = new String ("hello");
String str1 = new String ("hello");
String str2 = new String ("hello");
System.out.println(a==b);//true
System.out.println(str2==str1);//false
str1 = str ;
str2 = str ;
System.out.println(str1==str2);//true
}
在上面这块代码中, a==b 结果为true 很好理解,因为两个变量的值都是相等的。但是, str1 和 str2 两次比较的值为什么不同呢?
在 java 中有着八中基本数据类型, 对于这八中数据类型的变量来说, " == "直接比较的就是变量中存储的值。因此在使用关系操作符 " == " 来比较时,比较的就是值本身。
但是对于变量指向对象的数据来说,这时候就涉及到了两块内存,一块是对象本身占用的内存(堆内存),变量也占一块内存。比如上面代码中的 str1 就是指向对象类型的数据,此时str1变量存储的并不是"值"本身,而是对象占用的那块内存的首地址,也就是说并不是直接存储的字符串 "hello" 。
因此在第一次 str1 == str2 的比较中得到的结果是 false 。因为它们分别指向的是不同的对象,也就是说它们实际存储的地址是不同的。
第二次 str1 == str 2 的比较中,因为它们都指向了同一个对象 str ,这时存储的地址是相同的,所以得到的结果是true。
2.什么是equals()?
equals() 方法是 Object 类中的方法,其他对象类型比较时,equals() 方法默认的是判断两者的内存地址是否相同,所以默认情况下是与 "==" 操作符的返回值相同,但是equals() 方法是可以被重写的,可以自己定义equals() 方法,"=="操作符不能被重写。
Object 中的equals() 方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return 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;
}
此时equals() 方法用来比较指向的字符串对象所存储的字符串是否相等。
总结:
1.对于 "==" 操作符来说,如果是基本数据类型的变量来说,则比较的是变量中存储的"值"是否相等;
如果是变量指向对象,则比较的是所指向对象的地址。
2.equals() 方法不能作用于基本数据类型的变量;
如果没有重写equals() 方法,则比较的是变量所指向对象的地址,
如果像String类中重写了equals() 方法,则比较的是所指向对象的内容。