1.關於==
首先要知道==用於匹配內存單元上的內容,其實就是一個數字,計算機內部也只有數字,而在java語言中,當==匹配時,就是比對兩個單元內存的內容是否一樣。
如果是原始類型,byte,boolean,short,char,int,long,float,double,就是直接比較他們的值。
如果是引用,比較的就是引用的值,引用的值可以被認為是對象的邏輯地址,如果兩個引用發生==操作,就是比較兩個相應的對象的地址值是否一樣,換句話說,如果兩個引用保存的是同一個對象,則返回true,否則返回false。
2.關於equals()
equals方法,首先是在Object中被定義的,它的定義中就是使用==方式來匹配的,也就是說,如果不去重寫equals方法,並且對應的類其父類列表中都沒有重寫過equals方法,那么默認的equals操作就是對比對象的地址。
equals方法之所以存在,是希望子類去重寫這個方法,實現對比值的功能,類似的,String就自己實現了該方法。
JDK1.7的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;
}
注:不論是1.6還是1.7,String.equals()的代碼邏輯大致如下:
(1)判定傳入的對象和當前對象是否為同一個對象,如果是就直接返回true.
(2) 判定傳入的類型值是否為String,若不是則返回false;
(3)判定傳入的String與當前的String的床都是否一致,若不一致就返回false;
(4)循環對比兩個字符串的char[]數組,逐個對比字符是否一致,若存在不一致的情況,則直接返回false;
(5)循環結束都沒有找到不匹配的,所以最后返回true;