java 學習記錄——equals和“==”
1.object類中的equals() 和 == 一樣
這是object中關於equals()方法的源碼
public boolean equals(Object obj) {
return (this == obj);
}
equals()和" == " 一樣,比較變量值相不相等,但是equals()只用在比較對象, “==”比較對象和基本類型。
比較基本類型 例如 int, float,char,long,double ,就是直接比較值一不一樣。
比較引用類型,其實也是比較值一不一樣,只不過引用變量的值比較特殊,這個值我們知道就是指向對應對象的內存地址。簡言之,就是比較兩個引用類型是不是指向同一塊堆內存地址。
2.在String類中,equals()方法被重寫過
先看Stringl類中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裏的equals()是真的在比較兩個引用變量指向的字符串對象,它們之間是不是每個字符都一樣。實際上,很多時候都需要重寫equals(),畢竟我們不是隻想比較兩個引用類型變量是不是指向同一塊兒地址。
3. 字符串的另一種創建方式
我們知道String的創建方式有很多,例如下面兩種,涉及到常量池
String str1 = new String("str");
String str2 = new String("str");
System.out.println(str1.equals(str2)); //true 因爲String類中重寫了equals()方法,會真的比較字符串中的內容
System.out.println((str1==str2));//false 因爲引用變量 str1 和str2 指向的堆中內存地址不一樣
//第二種方法
String str11 = "strrrrrrrrrrrr";
String str22 = "strrrrrrrrrrrr";
//當執行String str11 = “strrrrrrrrrrrr”;這條語句時,
// 會在堆中的字符常量池裏找”strrrrrrrrrrrr”這個字符串
// 若沒有找到,則將”strrrrrrrrrrrr”這個字符串放入字符串常量池中.
// 而在棧中開闢一塊名爲str11的空間存放”strrrrrrrrrrrr”這塊空間的引用.
// 當執行String str22 = “strrrrrrrrrrrr”;這條語句時,
// 會在堆中的字符串常量池裏找”strrrrrrrrrrrr”這個字符串,
// 很顯然,可以找到,於是便把字符常量池裏”strrrrrrrrrrrr”這個字符串的引用地址賦給s2,
// 因此str11與str22存放的都是堆中字符常量池中的同一個”strrrrrrrrrrrr”的引用
System.out.println(str11.equals(str22));//true
System.out.println((str11==str22));//true