1. 程式人生 > >Java開發雜談(五)== 和 equals

Java開發雜談(五)== 和 equals

1、==

==是操作符,如果作用於基本資料型別的變數,則直接比較其儲存的 “值”是否相等;如果作用於引用型別的變數,則比較的是所指向的物件的地址,也就是必須是同一個物件。

2、equals

如果沒有對equals方法進行重寫,比較的是引用型別的變數所指向的物件的地址;對於String、Date等類對equals方法進行了重寫的話,比較的是所指向的物件的內容。

在重寫equals方法的同時,必須重寫hashCode方法,因為重寫後equals的含義已經不一樣了,equals是先比較hashCode,再進行equals比較,這是為了提高效率。如果不重寫則可能會出現,equals相同,但hashCode不同,會產生預期外的結果。

3、來個測試

 public static void main(String[] args) {
         
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        Long h = 2L;
         
        System.out.println(c==d);
        System.out.println(e==f);
        System.out.println(c==(a+b));
        System.out.println(c.equals(a+b));
        System.out.println(g==(a+b));
        System.out.println(g.equals(a+b));
        System.out.println(g.equals(a+h));
    }

結論是:

1)true。

2)false。原因是大小在128以內的物件,再次建立時是直接取快取內的資料,也就是c、d的地址是同一個。

3)true。

4)true。原因還是128以內資料。

5)true。

6)false。原因是型別不同。

7)true。型別自動轉換。