糯米文學吧

位置:首頁 > 計算機 > java語言

Java面試實例int和Integer有什麼區別?

java語言2.69W

引導語:越是貌似簡單的面試題其中的玄機就越多,需要面試者有相當深厚的功力。以下是本站小編分享給大家的Java面試實例int和Integer有什麼區別?歡迎閲讀學習!

Java面試實例int和Integer有什麼區別?

  int和Integer有什麼區別?

答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入了基本數據類型,但是為了能夠將這些基本數據類型當成對象操作,Java為每一個基本數據類型都引入了對應的包裝類型(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

Java 為每個原始類型提供了包裝類型:

- 原始類型: boolean,char,byte,short,int,long,float,double

- 包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

12345678910class AutoUnboxingTest {public static void main(String[] args) {Integer a = new Integer(3);Integer b = 3; // 將3自動裝箱成Integer類型int c = 3;tln(a == b); // false 兩個引用沒有引用同一對象tln(a == c); // true a自動拆箱成int類型再和c比較}}

最近還遇到一個面試題,也是和自動裝箱和拆箱有點關係的,代碼如下所示:

123456789public class Test03 {public static void main(String[] args) {Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;tln(f1 == f2);tln(f3 == f4);}}

如果不明就裏很容易認為兩個輸出要麼都是true要麼都是false。首先需要注意的是f1、f2、f3、f4四個變量都是Integer對象引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什麼呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOf,如果看看valueOf的`源代碼就知道發生了什麼。

12345public static Integer valueOf(int i) {if (i >= && i <= )return e[i + ()];return new Integer(i);}

IntegerCache是Integer的內部類,其代碼如下所示:

1234567891011121314151617181920212223242526272829303132333435363738394041424344/*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache is initialized on first usage. The size of the cache* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.* During VM initialization, property* may be set and saved in the private system properties in the* class.*/private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =avedProperty("");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = (i, 127);// Maximum array size is _VALUEh = (i, _VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < th; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert >= 127;}private IntegerCache() {}}

簡單的説,如果整型字面量的值在-128到127之間,那麼不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1==f2的結果是true,而f3==f4的結果是false。