小編給大家分享一下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)的編程難度
下面給出一個典型例子,也是很多人踩過的坑,程序如下(建議自己在機(jī)器上實踐操作下)
Integer a1 = 127, b1 = 127; Integer a2 = 128, b2 = 128; System.out.println(a1 == b1); // true System.out.println(a2 == b2); // false
可以思考下為什么會出現(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é)果了,就是
a1 == b1 對象的引用都是從緩存中取出,實際上是相同對象,所以結(jié)果的 true
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
應(yīng)當(dāng)避免無意的使用拆裝箱 自動拆/裝箱實際上是 Java 一種編譯期的優(yōu)化(技巧),算是一種語法糖,只是 Java 在編譯期幫你自動轉(zhuǎn)化,最終生成的字節(jié)碼還是和你自己轉(zhuǎn)換是一樣的,無意的創(chuàng)建十萬個對象對于程序的內(nèi)存開銷和處理速度來說是巨大的代價
包裝類應(yīng)避免使用 == 運算符進(jìn)行值比較
注意緩存機(jī)制的范圍
以上我只大概列出的典型回答,其實對于大多數(shù)面試能回答以上內(nèi)容就已經(jīng)算可以及格了,有的公司面試官以喜歡追問出名,直到候選人回答說不知道,才會打住,這道看似簡單的題目,其實可以深挖的點還有很多,進(jìn)一步考察你的基本功是否扎實,例如:
線程安全的 Integer (考察你對 java.util.concurrent 并發(fā)包的理解)
基本數(shù)據(jù)類型和引用類型的局限(考察你對 Java 泛型的理解)
對象在內(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è)資訊頻道!