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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章