1. 程式人生 > >String型別中 "=="和"equals"比較的差別

String型別中 "=="和"equals"比較的差別

String型別中 "=="和"equals"比較的差別

  • 先說明一下String型別的變數的建立方式

    在建立新的String型別的變數時,首先會在緩衝區查詢是否有這個產量對應的物件,有就直接將找到的物件的地址賦給新建立的變數,沒有就重新建立一個物件,然後賦給新建立的變數

String str = "str";//建立一個新的String型別的變數,在已有的緩衝區中沒有就重新建立一個
String str1 = "str";//建立時在緩衝區發現有和即將建立的值一樣的物件,就將str的地址賦給str1
str == str1;//true
String str2 = new String("str");//強制建立一個物件str2,地址和str,str1不同
str2 == str;//false因為==比較的是物件的地址,而二者地址不同,故為false
str2 == str1;//false同上
 
str2.equals(str1);//true  String繼承Object方法中的equals方法進行重寫,內部比較是兩個String型別的字串一個一個字元的比較(下邊是原始碼)
str2.eauals(str);//true同上
 
 
public boolean equals(Object anObject) {//String類中equals原始碼
        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"的比較

    所有的類都繼承了Object類,Object類中有一個equals方法,原始碼如下

    public boolean equals(Object obj) {
            return (this == obj);
        }

    "=="比較的就是引用物件的地址是否相等,而不是比較值,比較值的話就需要重寫equals方法

    對於基本資料型別只能用"==",比較的是兩個基本型別的值