你知道在Java中Integer和int的這些區(qū)別嗎?
一、基本概念(重要)
- Integer 是 int 的包裝類(lèi),int 則是 java 的一種基本數(shù)據(jù)類(lèi)型;
- Integer 變量必須實(shí)例化后才能使用,而int變量不需要;
- Integer 實(shí)際是對(duì)象的引用,當(dāng)new一個(gè) Integer時(shí),實(shí)際上是生成一個(gè)指針指向此對(duì)象;而 int 則是直接存儲(chǔ)數(shù)據(jù)值;
- Integer的默認(rèn)值是null,int的默認(rèn)值是0。
二、拓展
基于以上的一些概念,這里我們拓展一下,對(duì)于Integer包裝類(lèi)型與int基本數(shù)據(jù)類(lèi)型之間數(shù)值相互比較的結(jié)果進(jìn)行一下說(shuō)明,這個(gè)也可能在面試當(dāng)中會(huì)被問(wèn)到。
三、new Integer()與new Integer()的比較
下面的代碼大家覺(jué)得結(jié)果是什么呢?大家可以先自己想一想然后再繼續(xù)往下看。
public static boolean comp(){ Integer i1=new Integer(10); Integer i2=new Integer(10); return i1==i2; }
Integer 變量必須實(shí)例化后才能使用,也就是我們必須new Integer()之后才可以使用,而我們知道,任何對(duì)象只要是new出來(lái)的都會(huì)放在堆內(nèi)存中,同時(shí)該變量存儲(chǔ)指向堆內(nèi)存的地址,只要new出來(lái)的對(duì)象就是一個(gè)新對(duì)象,也就是說(shuō)i1和i2指向的兩個(gè)不同的對(duì)象,為了證明這一點(diǎn),我們通過(guò)javap -v 看一下字節(jié)碼,也能看的很清楚。
因?yàn)槭莾蓚€(gè)不同的對(duì)象,所以上面的結(jié)果是false。
四、Integer與new Integer()的比較
再看下面的代碼,Integer變量 和 new Integer() 變量比較
public static boolean comp1(){ Integer i1=new Integer(10); Integer i2=10; return i1==i2; }
因?yàn)?Integer變量 指向的是 java 常量池中的對(duì)象,而 new Integer() 的變量指向堆中新建的對(duì)象,兩者在內(nèi)存中的地址不同,兩者比較的話(huà)永遠(yuǎn)為 false。
五、Integer與Integer的比較
public static void comp2(){ Integer i = 100; Integer j = 100; System.out.print(i == j); Integer m = 128; Integer n = 128; System.out.print(m == n); }
這里為什么會(huì)列舉兩個(gè)呢?大家往下看。
其實(shí)Integer i = 100 在編譯時(shí),會(huì)翻譯成為 Integer i = Integer.valueOf(100),而 java 對(duì) Integer類(lèi)型的 valueOf 的定義如下:
這里的low和high分別為-128和127。
閱讀源碼我們可以很清晰的看到,java對(duì)于-128到127之間的數(shù),會(huì)進(jìn)行緩存,所以 當(dāng)Integer i 的值在 -128到127之間時(shí),會(huì)將值進(jìn)行緩存,下次再取Integer j(值在 -128到127之間)時(shí),就會(huì)直接從緩存中取,就不會(huì)new了,這樣拿到的就是同一個(gè)對(duì)象。當(dāng)Integer i 的值不在 -128到127之間時(shí),每次都會(huì)重新new Integer(),那么每次都會(huì)是不同的對(duì)象。所以看到這里,大家應(yīng)該知道上面的兩個(gè)不同的比較的結(jié)果是什么了把,前者為true,后者為false。
六、int 變量 與 Integer、 new Integer() 比較
int 變量 與 Integer、 new Integer() 比較時(shí),只要兩個(gè)的值是相等,則為true,需要說(shuō)明的是包裝類(lèi)Integer 和 基本數(shù)據(jù)類(lèi)型int 比較時(shí),java會(huì)自動(dòng)拆包裝為int ,然后進(jìn)行比較,實(shí)際上就變?yōu)閮蓚€(gè)int變量的比較。
Integer i = new Integer(10); //自動(dòng)拆箱為 int i=10; 此時(shí),相當(dāng)于兩個(gè)int的比較 int j = 10; System.out.print(i == j); //true
看完了以上的,大家看看下面的比較大家能否寫(xiě)出正確的結(jié)果。
public static void comp3(){ int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); System.out.println("i == i2 = " + (i == i2)); // Integer會(huì)自動(dòng)拆箱為int,所以為true System.out.println("i == i3 = " + (i == i3)); // true,理由同上 Integer i4 = 127;// 編譯時(shí)被翻譯成:Integer i4 = Integer.valueOf(127); Integer i5 = 127; System.out.println("i4 == i5 = " + (i4 == i5));// true Integer i6 = 128; Integer i7 = 128; System.out.println("i6 == i7 = " + (i6 == i7));// false Integer i8 = new Integer(127); System.out.println("i5 == i8 = " + (i5 == i8)); // false Integer i9 = new Integer(128); Integer i10 = new Integer(128); System.out.println("i9 == i10 = " + (i9 == i10)); // false }
public static void comp4(){ Integer a = new Integer(127), b = new Integer(128); int c = 127, d = 128, dd = 128; Integer e = 127, ee = 127, f = 128, ff = 128; System.out.println(a == b); // false 因?yàn)閍,b都是new出來(lái)的對(duì)象,地址不同所以為false System.out.println(a == c); // true a會(huì)自動(dòng)拆箱為int類(lèi)型 System.out.println(a == e); // false 指向的地址不同a是new出來(lái)的 System.out.println(e == c); // true e會(huì)自動(dòng)拆箱為int類(lèi)型 System.out.println(e == ee);// true Integer對(duì) 處于-128到127范圍之間,指向了同一片地址區(qū)域 System.out.println(b == f); // false 指向的地址不同b是new出來(lái)的 System.out.println(f == d); // true f自動(dòng)拆箱為int類(lèi)型 System.out.println(f == ff); /* * false 指向的不是同一片地址區(qū)域。 * 在Integer類(lèi)型中,-128到127存放的是同一片區(qū)域地址, * 之外的數(shù)是另外開(kāi)辟空間來(lái)進(jìn)行 存儲(chǔ)的 */ System.out.println(d == dd); // true 不解釋 }
public static void comp5(){ Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59); System.out.println(i01 == i02);//true System.out.println(i01 == i03);//true System.out.println(i03 == i04);//false System.out.println(i02 == i04);//true }
public static void comp6(){ Integer i01 = 128; int i02 = 128; Integer i03 = Integer.valueOf(128); Integer i04 = new Integer(128); System.out.println(i01 == i02);//true System.out.println(i01 == i03);//false System.out.println(i03 == i04);//false System.out.println(i02 == i04);//true }
到此這篇關(guān)于你知道在Java中Integer和int的這些區(qū)別嗎?的文章就介紹到這了,更多相關(guān)Integer和int的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談Java中Int、Integer、Integer.valueOf()、new Integer()之間的區(qū)別
- Java 如何判斷Integer類(lèi)型的值是否相等
- Java Integer對(duì)象的比較方式
- Java修改Integer變量值遇到的問(wèn)題及解決
- JAVA基本類(lèi)型包裝類(lèi) BigDecimal BigInteger 的使用
- Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解
- 詳談java中int和Integer的區(qū)別及自動(dòng)裝箱和自動(dòng)拆箱
- 聊聊Java BigInteger里面的mod和remainder的區(qū)別
- 詳解Java中包裝類(lèi)Integer的使用
- Java中int和Integer的區(qū)別
相關(guān)文章
如何使用HttpClient發(fā)送java對(duì)象到服務(wù)器
這篇文章主要介紹了如何使用HttpClient發(fā)送java對(duì)象到服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11springBoot 項(xiàng)目排除數(shù)據(jù)庫(kù)啟動(dòng)方式
這篇文章主要介紹了springBoot 項(xiàng)目排除數(shù)據(jù)庫(kù)啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot異步實(shí)現(xiàn)的8種方式
異步執(zhí)行對(duì)于開(kāi)發(fā)者來(lái)說(shuō)并不陌生,在實(shí)際的開(kāi)發(fā)過(guò)程中,很多場(chǎng)景多會(huì)使用到異步,本文主要介紹了SpringBoot異步實(shí)現(xiàn)的8種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Java 設(shè)計(jì)模式之責(zé)任鏈模式及異步責(zé)任鏈詳解
顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類(lèi)型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類(lèi)型的設(shè)計(jì)模式屬于行為型模式2021-11-11深入解析Java設(shè)計(jì)模式編程中觀察者模式的運(yùn)用
這篇文章主要介紹了Java設(shè)計(jì)模式編程中觀察者模式的運(yùn)用,觀察者模式主要是為了將對(duì)象進(jìn)行與被觀察者一樣的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02Java?導(dǎo)出Excel增加下拉框選項(xiàng)
這篇文章主要介紹了Java?導(dǎo)出Excel增加下拉框選項(xiàng),excel對(duì)于下拉框較多選項(xiàng)的,需要使用隱藏工作簿來(lái)解決,使用函數(shù)取值來(lái)做選項(xiàng),下文具體的操作詳情,需要的小伙伴可以參考一下2022-04-04Java中LocalCache本地緩存實(shí)現(xiàn)代碼
本篇文章主要介紹了Java中LocalCache本地緩存實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Java中SpringSecurity密碼錯(cuò)誤5次鎖定用戶(hù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Java中SpringSecurity密碼錯(cuò)誤5次鎖定用戶(hù)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)
下面小編就為大家?guī)?lái)一篇java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05