// 測驗代碼
public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 128; Integer f = 128; Long g = 3l; 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)); }
輸出結果:
true false true true true false
原因:
1.記憶體地址對比,但是由于值處于-128~127,因此存盤在常量池中,記憶體地址相同
2.記憶體地址對比,由于值不在-128~127,因此值存盤在堆中,記憶體地址不同
3.遇到運算子+號,自動拆箱為int型別對比,值相同
4.呼叫Integer的equals方法,遇到+號,自動拆箱為int型別的3,傳入equals方法,自動裝箱為Integer型別的3,進行值對比,具體可查看Integer型別的equals方法原始碼,值相同
5.遇到運算子+ 號,自動拆箱為int,與Long型別對比,自動轉型為long(編譯時),自動拆箱為long型別對比,值相同
6.遇到運算子+ 號,自動拆箱為int,傳入equals方法,自動裝箱為Integer型別的3,不屬于Long型別,具體可查看Long型別的equals方法原始碼,回傳false
解釋一下==和equals的區別
| 定義 | 對于基本資料型別 | 對于參考資料型別 | |
| == | 運算子 | 對比值 | 對比記憶體地址 |
| equals | Object類的方法 | - | 使用==對比,可以看下Object類下的equals方法原始碼 |
附上原始碼:
Object equals方法

Integer equals方法

Long equals方法

另外自動轉型:
原始碼:

編譯后:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546965.html
標籤:其他
上一篇:java介面學習筆記
