測試代碼:
@Test public void IntegerTest() { Integer i01 = 59; int i02 = 59; Integer i03 = Integer.valueOf(59); Integer i04 = new Integer(59); System.out.println(i01==i02); System.out.println(i01==i03); System.out.println(i03==i04); System.out.println(i02==i04); }
運行結果:
true true false true
斷點調試分析結果:
i01是引用類型,如圖引用的地址為Integer@651
i02是值類型
i03是引用類型,因為引用類型值放在堆里面,如果堆里有值,i03這種取值方式就直接引用原有值的地址Integer@651
i04是引用類型,但是i04是new創建新對象,要在堆里新開空間存放值,也就會有新地址Integer@652
i01與i02比較,引用類型和值類型用等號比較,比較的是值(引用類型自動拆箱為int),故返回true;
i01與i03比較,引用類型和引用類型用等號比較,比較的是地址,兩個地址一樣,故返回true;
i03與i04比較,引用類型和引用類型用等號比較,比較的是地址,兩個地址不同,故返回false;
i02與i04比較,值類型與引用類型用等號比較,比較的是值(引用類型自動拆箱為int),故返回true;