1. 程式人生 > >equals和==詳解

equals和==詳解

equals和==小結

1. ==簡單介紹

== 比較的是兩個比較物件的記憶體地址是否相同,當兩個物件的記憶體地址相等時,返回 true,否則返回 false;
解釋:

  • == 比較的是兩端運算元(通常是物件的引用)是否是同一個物件,即在堆中是否有相同的記憶體地址,比較的是記憶體地址的
  • 基本資料型別中,比較值是否相等,如int i =10;
    double d= 10.0;
    (i==d)true
  • 兩邊的運算元必須是同一型別,或者父子類,否則不能通過編譯
2. equals

equals 比較的是兩個物件的實際內容是否相等,所有物件都適用,但是不適用於 基本型別,基本型別使用 ==!= 即可。
以下為 Object類中 的equals原始碼,可以發現equals方法預設返回的還是 ==的判斷(即是否為同一物件),由於所有的類都繼承java.lang.Object

,所以使用 equals方法時,若沒有重寫equals方法,則equals==沒有區別;

public boolean equals(Object obj) {
        return (this == obj)//注意
    }
3. String和自己建立的類

String 型別有兩種初始化方法
①:String str = new String("xx");String str2 = "xxx";
這兩種方法有著很大的不同,先看第一種,使用 new 來初始化 String 類,與其他普通物件沒有區別,都是在堆中開闢一段記憶體空間,儲存字串 “xx”,str 指向此記憶體地址;
第二種方法,首先會在 JVM 內部發生字串拘留,即當宣告這樣的一個字串後,JVM 會在常量池中先查詢有沒有一個值為 “xxx” 的物件,如果有,就會把它賦給當前引用,如果沒有,則在常量池中新建立一個 “xxx” 物件,當下一次還有使用這種方法初始化字串為 “xxx”時,會直接將此字串的引用執行之前的 “xxx” 物件,此時多個引用指向同一個物件

以下是使用 == 比較 String 物件

   @Test
   public void test1(){
       String str11 = new String("初始化字串");
       String str12 = new String("初始化字串");
       String str21 = "初始化字串";
       String str22 = "初始化字串";

       //使用 == 比較使用 new 關鍵字初始化的字串物件是否為同一物件
       System.out.println(str11==str12);// false 非同一物件

       //使用 == 比較使用直接賦值初始化的字串物件是否為同一物件
       System.out.println(str21==str22); // true 同一物件
   }

String 使用 equals 比較

public void test2(){
        String str11 = new String("初始化字串");
        String str12 = new String("初始化字串");
        String str21 = "初始化字串";
        String str22 = "初始化字串";

        //使用 equals 比較使用 new 關鍵字初始化的字串物件 內容 是否相等
        System.out.println(str11.equals(str12));// true 內容相等

        //使用 equals 比較使用直接賦值初始化的字串物件 內容 是否相等
        System.out.println(str21.equals(str22)); // true 內容相等

        //使用 equals 比較使用兩種不同初始化的字串物件 內容 是否相等
        System.out.println(str11.equals(str21));// true 內容相等
    }

因為 String 類重寫了 equals 方法,所以使用 equals 比較時,比較的是實際內容是否相等,以下為 String 中重寫的 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;
    }

自建一個類,但是不重寫 equals 方法

class value {
        int i;
    }

    @Test
    public void test3() {
        //例項化兩個自定義類物件
        value v1 = new value();
        value v2 = new value();

        //將兩個物件的成員變數賦相同的初值
        v1.i = v2.i = 10;
        System.out.println(v1.equals(v2));//false
    }

因為自定義的類 value 未覆蓋 Object 的 equals 方法,所以使用 equals 預設返回的是 == 的比較結果。

參考:https://www.cnblogs.com/Eason-S/p/5524837.html