1. 程式人生 > >Java中 == 與 equals方法,以及常見的 == 比較

Java中 == 與 equals方法,以及常見的 == 比較

1、”==”:

是算數運算子,比較的是兩個引用指向的是否是同一個記憶體地址,也就是指向的是否是同一物件。

2、equals方法:

是屬於Object的方法,是開發者自己根據具體的業務邏輯來定義該方法,用於檢查兩個物件的相等性,注意是讓開發者自己去重寫的方法。比如String類重寫了equals方法。

  • Object類中的equals方法:
    public boolean equals(Object obj) {
        return (this == obj);
    }
  • 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
; }

3、常見的==比較

  • 基本資料型別

Java中的8個基本資料型別定義後時存在常量池中,而對應的封裝類定義後是物件。

Integer a = new Integer(128);
Integer b1 = 128;
Integer b2 = 128;
int c1 = 128;
int d2 = 128;
//false,因為a、b都是物件,且不是同一物件
System.out.println(a == b1);
//true 此時a與c比較時會自動拆箱成為基本資料型別,故此時比較為true
System.out.println(a == c1);
//true原理同上
System.out.println(b1 == c1);
//true基本資料型別定義後,存在常量池,故為true
System.out.println(c1 == c2);





//反常點來了

//false,因為b1、b2是兩個物件且不是同一物件,故為false
System.out.println(b1 == b2);

//但是b1、b2定義改為以下時:
Integer b1 = 127;//128改為127
Integer b2 = 127;

//此時照理說應該為false,但卻是為true。
System.out.println(b1 == b2);

其實java在編譯Integer b1 = 127的時候,被翻譯成-> Integer b1 = Integer.valueOf(127);所以關鍵就是看valueOf()函數了。只要看看valueOf()函式的原始碼就會明白了。JDK原始碼的valueOf函式式這樣的:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

看一下原始碼大家都會明白,對於-128到127之間的數,會進行快取,Integer b1 = 127時,會將127進行快取,下次再寫Integer b2 = 127時,就會直接從快取中取,就不會new了。這是需要注意的一點。

  • 字串型別

需要特別注意的是在String中,如果以這樣的方法定義String a = “hello”;則定義後的字串也是存在常量池中。

        //定義後為物件
        String a = new String("hello");
        //定義後為字串常量
        String b = "hello";
        //定義後為物件
        String c = "he"+ new String("llo");

        //定義後為字串常量
        String b2 = "hello";

        //false是兩個不同物件
        System.out.println(a == b);
        //false,同上
        System.out.println(a == c);
        //false,同上
        System.out.println(b == c);

        //true,因為兩者都是字串常量
        System.out.println(b == b2);