欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Integer和int的區(qū)別解讀

 更新時(shí)間:2023年12月29日 09:50:30   作者:理想萬(wàn)歲萬(wàn)萬(wàn)歲  
這篇文章主要介紹了Java中Integer和int的區(qū)別解讀,大家都知道他可以表示一個(gè)整數(shù),而且也知道可以表示整數(shù)的還有int,只是使用Integer的次數(shù)要比int多得多,今天我們就來(lái)好好探究一下Integer與int的區(qū)別以及更深處的知識(shí),需要的朋友可以參考下

一、介紹

各位小伙伴們無(wú)論在工作還是學(xué)習(xí)中,與Integer都有著過(guò)硬的交情,我說(shuō)的沒(méi)錯(cuò)吧,大家都知道他可以表示一個(gè)整數(shù),而且也知道可以表示整數(shù)的還有int,只是使用Integer的次數(shù)要比int多得多,今天我們就來(lái)好好探究一下Integer與int的區(qū)別以及更深處的知識(shí)。

二、不同點(diǎn)

Integer是包裝類型(即引用類型),int是基本類型。

也就是說(shuō),Integer是一個(gè)類,里面有很多方法可以使用,例如

boolean equals(Object obj){...}
int compareTo(Integer anotherInteger){...}

而int不是一個(gè)類,能做的只有+、-、*、/、=五種運(yùn)算,例如

int a = 3;  
int b = 4; 
int c = a + b;

Integer的默認(rèn)值是null,int的默認(rèn)值是0

在這里插入圖片描述

Integer變量使用之前必須先實(shí)例化,int變量可以直接使用。

Integer如果沒(méi)有實(shí)例化就直接使用會(huì)報(bào)空指針異常(因默認(rèn)值為null);int如果沒(méi)有初始化則使用默認(rèn)值0。

三、相同點(diǎn)

取值范圍相同

最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)

最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)

在這里插入圖片描述

原因:眾所周知,整型變量在內(nèi)存中的字節(jié)數(shù)是4個(gè)字節(jié),一個(gè)字節(jié)是8位,因此一個(gè)整型變量占據(jù)32位,且首位為0表示非負(fù)數(shù),1表示負(fù)數(shù)。

四、使用equals()和==的區(qū)別

對(duì)于每個(gè)java開(kāi)發(fā)人員來(lái)說(shuō),Integer的用法再熟悉不過(guò)了,但仍然會(huì)有些工作一兩年的小伙伴依然搞不清楚不同情況下equals()方法和 == 等號(hào)究竟有什么結(jié)果,以至于在基礎(chǔ)的面試過(guò)程中翻跟頭體驗(yàn)屢試不爽。這次我們一次性把所有可能以及結(jié)果出清楚。

equals()

此方法由Object類定義,在Integer類中又對(duì)其進(jìn)行了重寫(xiě),我們來(lái)看一下重寫(xiě)后的方法。

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
}

這個(gè)方法先判斷參數(shù)對(duì)象是否繼承了Integer引用類型(如果參數(shù)是int基本類型,會(huì)先將其自動(dòng)裝箱成引用類型),如果沒(méi)有繼承Integer引用類型,則返false,這個(gè)很好理解,如果數(shù)字和字符相比,那叫什么事嘛。如果繼承了Integer引用類型,就先把它強(qiáng)轉(zhuǎn)成Integer類型,再通過(guò)intValue()方法將其拆箱為int基本類型,再和value進(jìn)行地址比較(==右邊的value表示的是此Integer對(duì)象在常量池中的值,該值其實(shí)也是及本來(lái)想常量)。

? 說(shuō)了一大堆,簡(jiǎn)單一句話就是equals()方法進(jìn)行的是常量池中的地址是否相等。

? 另外一點(diǎn):常量池中值相等的數(shù)據(jù)不會(huì)同時(shí)出現(xiàn),常量池中只保存一份相同的值。

==

比較兩個(gè)對(duì)象在內(nèi)存中的地址是否相等。

下面是我們使用equals()方法和==方法來(lái)判斷Integer和int的區(qū)別。在此之前,我們要先知道裝箱和拆箱、常量池對(duì)象和堆內(nèi)存對(duì)象兩個(gè)概念:

裝箱

將基本數(shù)據(jù)類型變成引用類型的過(guò)程。發(fā)生在將基本數(shù)據(jù)類型賦值給引用類型的時(shí)候, 如Integer i = 5;

拆箱

將引用類型變成基本數(shù)據(jù)類型的過(guò)程。發(fā)生在將引用類型和基本數(shù)據(jù)類型做運(yùn)算的時(shí)候,如下所示

Integer i = 5; 
int j = 5; 
System.out.println(i==j);

常量池對(duì)象

保存的是創(chuàng)建對(duì)象時(shí)的字面量,相等的字面量只保存一次

堆內(nèi)存對(duì)象

保存的是new一個(gè)對(duì)象時(shí)這個(gè)對(duì)象在堆內(nèi)存中的地址

聲明變量使用equals()方法比較使用==比較
1Integer i = new Integer(1);
Integer j = new Integer(1);
truefalse
2Integer i = new Integer(1);
Integer j = 1;
truefalse
3Integer i = new Integer(1);
int j = 1;
truetrue
4Integer i = 1;
Integer j = 1;
truetrue
5Integer i = 1;
int j = 1;
truetrue
6int i = 1;
int j = 1;
——true
7Integer i = new Integer(128);
Integer j = new Integer(128);
truefalse
8Integer i = new Integer(128);
Integer j = 128;
truefalse
9Integer i = new Integer(128);
int j = 128;
truetrue
10Integer i = 128;
Integer j = 128;
truefalse
11Integer i = 128;
int j = 128;
truetrue
12int i = 128;
int j = 128;
——true

情況1

在Integer i = new Integer(1)的過(guò)程中,java為我們做了兩件事,先在常量池中創(chuàng)建一個(gè)int=1的常量,再在堆內(nèi)存中創(chuàng)建一個(gè)對(duì)這個(gè)常量的地址引用,因此在用equals()方法時(shí)比較的是常量池中int=1這個(gè)常量,自己和自己比較的結(jié)果當(dāng)然為true;

而在==運(yùn)算時(shí),直接比較了堆內(nèi)存中的地址,于是比較的結(jié)果為false

情況2

在Integer j = 1的過(guò)程中,實(shí)際上是java為我們?cè)诔A砍刂猩闪艘粋€(gè)常量對(duì)象1,然后j對(duì)象指向這個(gè)常量對(duì)象的地址。

equals()運(yùn)算結(jié)果為true是因?yàn)楸容^的是常量池中對(duì)象的比較,實(shí)際上常量池中只有一個(gè)值為1的對(duì)象,即自己比較自己。

==運(yùn)算結(jié)果為false是因?yàn)楸容^的是堆內(nèi)存中對(duì)象j的地址和常量池中常量對(duì)象1的地址,是兩個(gè)不同的地址比較

情況3

equals()運(yùn)算結(jié)果為true可以參考上面的源碼以及下方解釋

==運(yùn)算結(jié)果為true是因?yàn)橐妙愋虸nteger和基本數(shù)據(jù)類型int比較時(shí),引用類型會(huì)自動(dòng)拆包裝為int,然后進(jìn)行比較,實(shí)際上就變?yōu)閮蓚€(gè)int變量的比較,也是堆內(nèi)存中常量自己與自己的地址比較

情況4

變量i與變量j指向的其實(shí)都是常量池中的常量對(duì)象1,因此equals()運(yùn)算和==運(yùn)算的結(jié)果都是true

情況5

與情況4相同, 如果有疑惑可在文章后面查找答案

情況6

基本數(shù)據(jù)類型只能進(jìn)行加、減、乘、除、等于五種運(yùn)算,沒(méi)有equals()方法,==運(yùn)算為true還是因?yàn)槎褍?nèi)存中常量自己與自己進(jìn)行地址比較。

情況7

new Integer(128)會(huì)先在常量池中創(chuàng)建一個(gè)常量對(duì)象128,再在堆內(nèi)存中保存這個(gè)常量對(duì)象的地址,Integer i = new Integer(128)中變量i指向堆內(nèi)存中保存這個(gè)常量對(duì)象地址的地址,它是指向堆內(nèi)存的。可以理解為兩個(gè)不同的堆內(nèi)存地址指向相同的常量池地址。

equals()運(yùn)算結(jié)果為true是因?yàn)楸容^的是常量池中的地址,而該地址只有一個(gè),自己比較自己,結(jié)果為true

==運(yùn)算比較的是這兩個(gè)堆內(nèi)存的地址,因此結(jié)果為false

情況8

equals()運(yùn)算結(jié)果為true說(shuō)了很多遍了,都是同一個(gè)原因

==運(yùn)算為false是因?yàn)楸容^的是堆內(nèi)存中兩個(gè)對(duì)象的地址,原因和情況5相同,可在文章后面查找答案

情況9

與情況3相同

情況10

與情況8相同,可在文章后面查找答案

情況11

與情況3相同

情況12

與情況6相同

五、解惑

JVM中一個(gè)字節(jié)一下的整型數(shù)據(jù)(即[128,127])會(huì)在JVM啟動(dòng)時(shí)加載進(jìn)內(nèi)存,除非用new Integer()顯示的創(chuàng)建對(duì)象,否則都是同一對(duì)象。當(dāng)使用Integer i = 1時(shí),會(huì)將1這個(gè)數(shù)字進(jìn)行緩存,下次再運(yùn)行Integer j = 1時(shí),就會(huì)直接從緩存中取,就不會(huì)new了, 這樣取到的1 地址也是相同的, ==判斷返回true。

對(duì)于-128 ~ 127范圍之外的數(shù) 實(shí)際上就是new得到的, 地址不同==判斷為false

java在編譯Integer i = 100 ;時(shí),java內(nèi)部會(huì)將其翻譯成為Integer i = Integer.valueOf(100);

所以關(guān)鍵就是看valueOf()函數(shù)了。JDK源碼的valueOf()是這樣的

在這里插入圖片描述

到此,Integer與int運(yùn)算時(shí)的迷之操作總算解釋清楚了,如果有需要指正或者補(bǔ)充的,請(qǐng)小伙伴們掃下方二維碼關(guān)注公眾號(hào)并在后臺(tái)留言,我會(huì)及時(shí)給予回復(fù),讓我們一起把java學(xué)到荒,頭發(fā)掉到光。

到此這篇關(guān)于Java中Integer和int的區(qū)別解讀的文章就介紹到這了,更多相關(guān)Integer和int的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java this關(guān)鍵字的引用詳解

    Java this關(guān)鍵字的引用詳解

    每個(gè)類中都有一個(gè)本類的this引用,類似:類名 this;實(shí)例對(duì)象時(shí),this引用指向?qū)ο蟊旧?,其最主要的作用是讓類中的方法可以訪問(wèn)本類中的另外一個(gè)方法或?qū)傩?,因?yàn)檎{(diào)用一個(gè)方法或?qū)傩?非類方法/屬性)必須要有實(shí)例
    2022-03-03
  • JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送

    JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了JavaMail實(shí)現(xiàn)帶附件的郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Eclipse代碼格式化設(shè)置簡(jiǎn)單介紹

    Eclipse代碼格式化設(shè)置簡(jiǎn)單介紹

    這篇文章主要介紹了Eclipse代碼格式化設(shè)置簡(jiǎn)單介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • spring多數(shù)據(jù)源配置實(shí)現(xiàn)方法實(shí)例分析

    spring多數(shù)據(jù)源配置實(shí)現(xiàn)方法實(shí)例分析

    這篇文章主要介紹了spring多數(shù)據(jù)源配置實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了spring多數(shù)據(jù)源配置相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 由淺到深帶你詳談Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式

    由淺到深帶你詳談Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式

    這篇文章主要詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)組擴(kuò)容的三種方式,新建一個(gè)數(shù)組,把原來(lái)數(shù)組的內(nèi)容搬到新數(shù)組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價(jià)值,需要的朋友可以借鑒一下
    2023-06-06
  • spring boot封裝HttpClient的示例代碼

    spring boot封裝HttpClient的示例代碼

    這篇文章主要介紹了spring boot封裝HttpClient的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java解決同時(shí)出庫(kù)入庫(kù)訂單號(hào)自動(dòng)獲取問(wèn)題解決

    Java解決同時(shí)出庫(kù)入庫(kù)訂單號(hào)自動(dòng)獲取問(wèn)題解決

    在Java中,處理多線程環(huán)境下的訂單號(hào)生成問(wèn)題可以采用多種策略,如使用AtomicLong保證線程安全,通過(guò)定義訂單號(hào)生成器并利用線程模擬出庫(kù)和入庫(kù)操作,每個(gè)線程從訂單號(hào)生成器中獲取唯一訂單號(hào),感興趣的朋友一起看看吧
    2024-09-09
  • SpringBoot?Validation快速實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例代碼

    SpringBoot?Validation快速實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例代碼

    在實(shí)際開(kāi)發(fā)中,肯定會(huì)經(jīng)常遇到對(duì)參數(shù)字段進(jìn)行校驗(yàn)的場(chǎng)景,通常我們只能寫(xiě)大量的if else來(lái)完成校驗(yàn)工作,而如果使用SpringBoot Validation則可以輕松的通過(guò)注解來(lái)完成,接下來(lái)小編給大家介紹下利用SpringBoot?Validation快速實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例代碼,需要的朋友參考下吧
    2022-06-06
  • Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案

    Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案

    這篇文章主要介紹了Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Java中struts2和spring MVC的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中struts2和spring MVC的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java中struts2和spring MVC的區(qū)別,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09

最新評(píng)論