1. 程式人生 > >java中的==與equals()分析與原始碼分析

java中的==與equals()分析與原始碼分析

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;