String型別中 "=="和"equals"比較的差別
阿新 • • 發佈:2019-01-10
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方法
對於基本資料型別只能用"==",比較的是兩個基本型別的值