聊聊面試-int和Integer的區別

680x450.jpg 最近面試了不少候選人,發現不少人都不過重視基礎,甚至連工做十幾年,項目經驗十幾頁的老程序員,框架學了一大堆,可是不少 Java 相關的基礎知識卻不少都答不上來。還有不少人會回答,只知道要用,可是歷來不會去看看它具體是怎麼實現的。java

咱們都知道做爲合格的程序員,基本功不紮實會致使你的程序出現許多你難以診斷的詭異問題,例如產生過大開銷(頻繁GC致使程序卡頓或者產生OOM),Integer 緩存機制產生的詭異現場(下面會詳細說),因此就有想寫一個關於面試相關係列的文章,把常見又容易採坑的面試問題總結一下,今天想站在面試官的角度去和你們聊聊一些面試的基礎題目,以及儘量指導你們如何給出一個能讓面試官滿意的答覆程序員

基本回答

int 是 8 個基本數據類型(boolean, byte, short, char, int, float, double, long)之一的整形類型,大小佔用4字節,取值範圍是正負 2 的 32(4 * 8)次冪,Java 雖然號稱一切都是對象,可是基本數據類型是例外面試

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

聊聊 Intger 的值緩存範圍

下面給出一個典型例子,也是不少人踩過的坑,程序以下(建議本身在機器上實踐操做下)緩存

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

能夠思考下爲何會出現以上這種詭異的狀況,而後咱們下面能夠看看 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;
    }
}

源碼以內無祕密,咱們能夠看出來出現以上問題的緣由是起因 JDK 對 Integer 構造的改進引入緩存機制致使的,傳統構造 Integer 的方式是直接調用構造器 new 一個對象,可是在考察和調研後發現大多數人使用 Integer 都集中在較小的範圍,所以 JDK 爲 Integer.valueOf 加強了一個緩存機制來改善構造對象的性能開銷(沒錯,自動拆箱裝箱反編譯後也是調用 valueOf() 方法實現構造對象)Java 官方文檔給出 Integer 緩存範圍是 -128 ~ 127微信

這裏面細節不少,咱們就不一一講述,到這裏咱們已經能夠得出結果了,就是併發

  1. a1 == b1 對象的引用都是從緩存中取出,其實是相同對象,因此結果的 true
  2. a2 == b2 是由於128已經超過了緩存值的範圍,Integer 經過 new 構造的對象,由於 == 比較的對象的引用而不是對象的值,因此結果天然就爲 false

經過以上案例能夠咱們能夠觸類旁通,不只僅 Integer 有緩存機制,整個包裝類都有緩存機制:框架

  • Boolean 緩存了 true/false 實例,也就是說 Boolean 只會有 Boolean.TRUE/FALSE 兩個常量實例
  • Short 緩存範圍是 -128 到 127 之間
  • Byte 範圍有限,所有數值都被緩存
  • 等等……

若是繼續深挖緩存,例如明確會頻繁使用更大範圍的 Integer 值得時候,咱們可使用 JVM 提供的參數工具

-XX:AutoBoxCacheMax=N
Integer 用起來有什麼注意事項嗎?
  1. 應當避免無心的使用拆裝箱 自動拆/裝箱其實是 Java 一種編譯期的優化(技巧),算是一種語法糖,只是 Java 在編譯期幫你自動轉化,最終生成的字節碼仍是和你本身轉換是同樣的,無心的建立十萬個對象對於程序的內存開銷和處理速度來講是巨大的代價
  2. 包裝類應避免使用 == 運算符進行值比較
  3. 注意緩存機制的範圍
總結

以上我只大概列出的典型回答,其實對於大多數面試能回答以上內容就已經算能夠及格了,有的公司面試官以喜歡追問出名,直到候選人回答說不知道,纔會打住,這道看似簡單的題目,其實能夠深挖的點還有不少,進一步考察你的基本功是否紮實,例如:

  1. 線程安全的 Integer (考察你對 java.util.concurrent 併發包的理解)
  2. 基本數據類型和引用類型的侷限(考察你對 Java 泛型的理解)
  3. 對象在內存中的結構(對象頭 Header,實例數據 Instance Data,對齊填充 Padding)

int 和 Integer 的區別,這算是典型高頻面試題之一,也是考察候選人基本功的題目之一,若是你基本功紮實,那麼這基本算是一道送分題,目前我瞭解的大多數大廠和重視技術的公司都是很是重視候選人的基本功,基礎決定你的上限在哪裏,因此這裏我也建議你們不要花太多精力在框架的使用和工具的安裝配置上,多沉下心的修煉基礎知識,理解基礎原理不只能夠很好的知足平常開發,並且還能夠幫助你走的更遠 更多技術諮詢,請關注公衆號,find me ! alt 微信公衆號

相關文章
相關標籤/搜索