Java中 == 和 equals()詳解


java中的數據類型分為兩種:

一 、基本數據類型:

  byte、short、int、long、float、double、char、boolean

  比較它們需要用  ==  ,比較的是它們的值是否相等

二、引用數據類型:

  也就是對基本數據類型的封裝,用 == 比較的是它們的內存地址(其實還是比較的基本數據類型,它們的內存地址不就是int嗎)。當new的時候,會給它一個新的內存地址,所以再通過==比較,就會返回false;在Object類中的equals方法其實比較的也是內存地址,用==和equals方法比較結果是一樣的,但在一些類中把equals方法重寫了,如String、Integer等類中,而不是單純的比較內存地址了。

  這個equals方法不是固定的,有需要的時候,我們根據情況自己重寫。

 

 

下面用簡單的代碼來測試一下吧,里面的注釋要注意看哦!其中的java源碼在文章末尾有截圖

public class Text{
    public static void main(String[] args){
        String str = "abcd";
        String str1 = "abcd1";
        int i = 1;
        String str2 = new String("abcd");

        //比較的是內存地址,內存地址是什么?一個16進制的整形值
        //java對象內存地址經過哈希算法得出一個int類型數字
        System.out.println( "abcd1" == str1 );
        
        //用的是String的equals方法,對字符串進行挨個比較
        System.out.println( str.equals("abcd") );

        //在javac的時候,虛擬機把字符串自動組合了???
        System.out.println( str.equals('a'+"bcd") );

        //比較的是內存的地址,str2創建的時候,用了一個關鍵字new,明確告訴虛擬機,我要一個新的,所以字符串"abcd"被當做一個新的創建,並且有一個新的內存地址
        if (str == str2) {
            System.out.println( "str == str2" );
        }else{
            System.out.println( "str != str2" );

            //調用的String里面的hashCode方法(文章末尾有java源碼),所以相等.那String中的hashCode方法算的是什么呢?難道是ASCII?
            ////確實是ASCII碼,      作者自己算過,
            //  
            //有些地方我們需要重寫hashCode方法,什么地方?
            //最常見的是當一個對象被加入收集對象(collection object)時,這兩個函數必須自己設計。更細化的定義是:如果你想將一個對象A放入另一個收集對象B里,
       //或者使用這個對象A為查找一個元對象在收集對 象B里位置的鑰匙,並支持是否容納,刪除收集對象B里的元對象這樣的操作,那么,equals()和hashCode()函數必須開發者自己定義。
       //其他情況下,這兩個函數是不需要定義的。 System.out.println( str.hashCode() ); System.out.println( str2.hashCode() ); } //調用String的equals java.lang.String中964行equals方法 //字符串底層是字符數組,所以String中的equals方法用兩個char數組,對立面的字符一個一個的比較 // //對象內容的比較才是設計equals()的真正目的,Java語言對equals()的要求如下,這些要求是必須遵循的。否則,你就不該浪費時間: //對稱性:如果x.equals(y)返回是“true”,那么y.equals(x)也應該返回是“true”。 //反射性:x.equals(x)必須返回是“true”。 //類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也應該返回是“true”。 //還有一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是“true”。 //任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。 // //有些情況下,我們需要自己重寫equals()方法,根據情況而定 if (str.equals(str2)) { System.out.println( "str equals str2" ); }else{ System.out.println( "str is not equals str2" ); } } }

運行結果:

 

 

總結:

    == :    比較的是基本數據類型,比較的是它們的值

   equals():   比較的是引用數據類型,比較的是引用數據類型,不同類型有不同的equals方法,根據不同的數據類型調用不同的equals方法。也可以在特殊情況下重寫equals方法。

 

Object中的equals():

String中的equals():

String中的hashCode():

 


免責聲明!

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



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