嗯先鋪墊一下Java中的相等問題,比較方法有equals和==,比較的方向有內容相等和地址相等。
1.equals:只能比較對象,比較對象地址是否相等;可以重寫equals方法,比如String重寫equals方法改爲內容是否相等。
2.==:可以比較基礎數據類型和對象,基礎數據類型比較值是否相等,對象比較地址是否相等。
看一個經典的問題,String的equals問題。
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException {
String ss= "test";
String ss1= "test";
String ss2= new String("test");
System.out.println(ss==ss1);
System.out.println(ss.equals(ss1));
System.out.println(ss==ss2);
System.out.println(ss.equals(ss2));
}
輸出結果:
ss==ss1:true
ss.equals(ss1):true
ss==ss2:false
ss.equals(ss2):true
其實這個問題上“==”的使用一直是沒有異議的,就是看String的地址是否相等。主要問題是equals的方法,很多博客在說的時候沒有區分String和Object在使用equals方法的區別,這很容易產生誤導(至少我很長一段時間就分不清equals的使用情況)。我們看一下String.equals()和Object.equals()的源碼就很容易理解這個問題。
//String的equals方法
public boolean equals(Object anObject) {
//首先是object同樣的比較方法,因爲地址相等那麼值肯定是相等的,也就沒有必要進行下面的比較了
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;
}
//object 的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
總結:我們看兩個對象是否是同一個對象就是看內存地址是否相等。(重點說明一下這裏說的不是對象是否相等)
這個不難理解,java中對象是存在java堆中,每new一個,就相當於新創建一個對象,系統就會分配一個存儲對象的唯一地址,如果兩個對象的地址是相同的那麼這兩個對象自然也就是同一個對象。