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

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

java中int和Integer的區(qū)別有哪些

小編給大家分享一下java中int和Integer的區(qū)別有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)霞浦,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

最近面試了很多候選人,發(fā)現(xiàn)很多人都不太重視基礎(chǔ),甚至連工作十幾年,項目經(jīng)驗十幾頁的老程序員,框架學(xué)了一大堆,但是很多 Java 相關(guān)的基礎(chǔ)知識卻很多都答不上來。還有很多人會回答,只知道要用,但是從來不會去看看它具體是怎么實現(xiàn)的。

我們都知道作為合格的程序員,基本功不扎實會導(dǎo)致你的程序出現(xiàn)許多你難以診斷的詭異問題,例如產(chǎn)生過大開銷(頻繁GC導(dǎo)致程序卡頓或者產(chǎn)生OOM),Integer 緩存機(jī)制產(chǎn)生的詭異現(xiàn)場(下面會詳細(xì)說),所以就有想寫一個關(guān)于面試相關(guān)系列的文章,把常見又容易采坑的面試問題總結(jié)一下,今天想站在面試官的角度去和大家聊聊一些面試的基礎(chǔ)題目,以及盡可能指導(dǎo)大家如何給出一個能讓面試官滿意的答復(fù)

基本回答

int 是 8 個基本數(shù)據(jù)類型(boolean, byte, short, char, int, float, double, long)之一的整形類型,大小占用4字節(jié),取值范圍是正負(fù) 2 的 32(4 * 8)次冪,Java 雖然號稱一切都是對象,但是基本數(shù)據(jù)類型是例外

Integr 是 int 的包裝類,是 JDK 1.5 中引入,提供了字符串轉(zhuǎn)換,數(shù)學(xué)運算,泛型,自動拆箱裝箱等實用功能,極大簡化了相關(guān)的編程難度

聊聊 Intger 的值緩存范圍

下面給出一個典型例子,也是很多人踩過的坑,程序如下(建議自己在機(jī)器上實踐操作下)

Integer a1 = 127,  b1 = 127;
Integer a2 = 128,  b2 = 128;
System.out.println(a1 == b1);       // true
System.out.println(a2 == b2);       // false
包裝類緩存機(jī)制的原因

可以思考下為什么會出現(xiàn)以上這種詭異的情況,然后我們下面可以看看 Integer.valueOf 的源碼

// Integer.valueOf 的源碼
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)    
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

private static class IntegerCache {    
    static final int low = -128;    
    static final int high;
    static final Integer cache[];

    static {
    int h = 127;
    ...
    high = h;
    }
}

源碼之內(nèi)無秘密,我們可以看出來出現(xiàn)以上問題的原因是原由 JDK 對 Integer 構(gòu)造的改進(jìn)引入緩存機(jī)制導(dǎo)致的,傳統(tǒng)構(gòu)造 Integer 的方式是直接調(diào)用構(gòu)造器 new 一個對象,但是在考察和調(diào)研后發(fā)現(xiàn)大多數(shù)人使用 Integer 都集中在較小的范圍,因此 JDK 為 Integer.valueOf 增強了一個緩存機(jī)制來改善構(gòu)造對象的性能開銷(沒錯,自動拆箱裝箱反編譯后也是調(diào)用 valueOf() 方法實現(xiàn)構(gòu)造對象)Java 官方文檔給出 Integer 緩存范圍是 -128 ~ 127

這里面細(xì)節(jié)很多,我們就不一一講述,到這里我們已經(jīng)可以得出結(jié)果了,就是

  1. a1 == b1 對象的引用都是從緩存中取出,實際上是相同對象,所以結(jié)果的 true

  2. a2 == b2 是因為128已經(jīng)超過了緩存值的范圍,Integer 通過 new 構(gòu)造的對象,因為 == 比較的對象的引用而不是對象的值,所以結(jié)果自然就為 false

通過以上案例可以我們可以舉一反三,不僅僅 Integer 有緩存機(jī)制,整個包裝類都有緩存機(jī)制:

  • Boolean 緩存了 true/false 實例,也就是說 Boolean 只會有 Boolean.TRUE/FALSE 兩個常量實例

  • Short 緩存范圍是 -128 到 127 之間

  • Byte 范圍有限,全部數(shù)值都被緩存

  • 等等……

如果繼續(xù)深挖緩存,例如明確會頻繁使用更大范圍的 Integer 值得時候,我們可以使用 JVM 提供的參數(shù)

-XX:AutoBoxCacheMax=N
Integer 用起來有什么注意事項嗎?
  1. 應(yīng)當(dāng)避免無意的使用拆裝箱 自動拆/裝箱實際上是 Java 一種編譯期的優(yōu)化(技巧),算是一種語法糖,只是 Java 在編譯期幫你自動轉(zhuǎn)化,最終生成的字節(jié)碼還是和你自己轉(zhuǎn)換是一樣的,無意的創(chuàng)建十萬個對象對于程序的內(nèi)存開銷和處理速度來說是巨大的代價

  2. 包裝類應(yīng)避免使用 == 運算符進(jìn)行值比較

  3. 注意緩存機(jī)制的范圍

總結(jié)

以上我只大概列出的典型回答,其實對于大多數(shù)面試能回答以上內(nèi)容就已經(jīng)算可以及格了,有的公司面試官以喜歡追問出名,直到候選人回答說不知道,才會打住,這道看似簡單的題目,其實可以深挖的點還有很多,進(jìn)一步考察你的基本功是否扎實,例如:

  1. 線程安全的 Integer (考察你對 java.util.concurrent 并發(fā)包的理解)

  2. 基本數(shù)據(jù)類型和引用類型的局限(考察你對 Java 泛型的理解)

  3. 對象在內(nèi)存中的結(jié)構(gòu)(對象頭 Header,實例數(shù)據(jù) Instance Data,對齊填充 Padding)

以上是“java中int和Integer的區(qū)別有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文題目:java中int和Integer的區(qū)別有哪些
當(dāng)前地址:http://weahome.cn/article/ieosop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部