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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM