Java開發雜談(五)== 和 equals
阿新 • • 發佈:2019-01-03
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。型別自動轉換。