真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Integer類和int類在Java中有什么不同

Integer類和int類在Java 中有什么不同?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,安福企業(yè)網(wǎng)站建設,安福品牌網(wǎng)站建設,網(wǎng)站定制,安福網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,安福網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

代碼實例如下

public static void main(String[] args) {
  Integer i = 10;
  Integer j = 10;
  System.out.println(i == j);
   
  Integer a = 128;
  Integer b = 128;
  System.out.println(a == b);
   
  int k = 10;
  System.out.println(k == i);
  int kk = 128;
  System.out.println(kk == a);
   
  Integer m = new Integer(10);
  Integer n = new Integer(10);
  System.out.println(m == n);
}

我們使用反編譯工具Jad,得到的代碼如下:

public static void main(String args[])
{
  Integer i = Integer.valueOf(10);
  Integer j = Integer.valueOf(10);
  System.out.println(i == j);
  Integer a = Integer.valueOf(128);
  Integer b = Integer.valueOf(128);
  System.out.println(a == b);
  int k = 10;
  System.out.println(k == i.intValue());
  int kk = 128;
  System.out.println(kk == a.intValue());
  Integer m = new Integer(10);
  Integer n = new Integer(10);
  System.out.println(m == n);
}

打印結(jié)果為:

Integer類和int類在Java 中有什么不同

首先,直接聲明Integer i = 10,會自動裝箱變?yōu)镮nteger i = Integer.valueOf(10);Integer i 會自動拆箱為 i.intValue()。

①、第一個打印結(jié)果為 true

對于 i == j ,我們知道這是兩個Integer類,他們比較應該是用equals,這里用==比較的是地址,那么結(jié)果肯定為false,但是實際上結(jié)果為true,這是為什么?

我們進入到Integer 類的valueOf()方法:

Integer類和int類在Java 中有什么不同

分析源碼我們可以知道在 i >= -128 并且 i <= 127 的時候,第一次聲明會將 i 的值放入緩存中,第二次直接取緩存里面的數(shù)據(jù),而不是重新創(chuàng)建一個Ingeter 對象。那么第一個打印結(jié)果因為 i = 10 在緩存表示范圍內(nèi),所以為 true。

②、第二個打印結(jié)果為 false

從上面的分析我們知道,128是不在-128到127之間的,所以第一次創(chuàng)建對象的時候沒有緩存,第二次創(chuàng)建了一個新的Integer對象。故打印結(jié)果為false

③、第三個打印結(jié)果為 true

Integer 的自動拆箱功能,也就是比較兩個基本數(shù)據(jù)類型,結(jié)果當然為true

④、第四個打印結(jié)果為 true

解釋和第三個一樣。int和integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比較。

⑤、第五個打印結(jié)果為 false

因為這個雖然值為10,但是我們都是通過 new 關鍵字來創(chuàng)建的兩個對象,是不存在緩存的概念的。兩個用new關鍵字創(chuàng)建的對象用 == 進行比較,結(jié)果當然為 false。

5、測試

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));

反編譯結(jié)果:

Integer類和int類在Java 中有什么不同

分析:第一個和第二個結(jié)果沒什么疑問,Integer類在-128到127的緩存問題;

第三個由于 a+b包含了算術(shù)運算,因此會觸發(fā)自動拆箱過程(會調(diào)用intValue方法),==比較符又將左邊的自動拆箱,因此它們比較的是數(shù)值是否相等。

第四個對于c.equals(a+b)會先觸發(fā)自動拆箱過程,再觸發(fā)自動裝箱過程,也就是說a+b,會先各自調(diào)用intValue方法,得到了加法運算后的數(shù)值之后,便調(diào)用Integer.valueOf方法,再進行equals比較。

第五個對于 g == (a+b),首先計算 a+b,也是先調(diào)用各自的intValue方法,得到數(shù)值之后,由于前面的g是Long類型的,也會自動拆箱為long,==運算符能將隱含的將小范圍的數(shù)據(jù)類型轉(zhuǎn)換為大范圍的數(shù)據(jù)類型,也就是int會被轉(zhuǎn)換成long類型,兩個long類型的數(shù)值進行比較。

第六個對于 g.equals(a+b),同理a+b會先自動拆箱,然后將結(jié)果自動裝箱,需要說明的是equals 運算符不會進行類型轉(zhuǎn)換。所以是Long.equals(Integer),結(jié)果當然是false

第七個對于g.equals(a+h),運算符+會進行類型轉(zhuǎn)換,a+h各自拆箱之后是int+long,結(jié)果是long,然后long進行自動裝箱為Long,兩個Long進行equals判斷。

關于Integer類和int類在Java 中有什么不同問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。


文章名稱:Integer類和int類在Java中有什么不同
本文路徑:http://weahome.cn/article/pscpis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部