java中的數據類型分為基本數據類型和復雜數據類型.int是基本數據類型,Integer是復雜數據類型.所以int的默認值為0,而Integer的默認值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況。
個人認為很多java api的調用包括方法的傳旨或者范型的使用都是基于Object的,所以引入了Integer,引入了自動裝箱與拆箱,這些方便api的調用.
自動裝箱:
Integer i = 100;相當于編譯器自動為您作以下的語法編譯:Integer i = Integer.valueOf(100);換句話說,裝箱就是jdk自己幫你完成了調用Integer.valueOf(100)。Integer類的valueOf(int i)方法實現
/** * Returns a <tt>Integer</tt> instance rePResenting the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }自動拆箱: 自動拆箱(unboxing),也就是將對象中的基本數據從對象中自動取出:
Integer i = 10; //裝箱 int m = i; //拆箱,實際上執行了 int m = i.intValue();下面的測試是針對int和Integer的區別分析
@Test public void testInteger(){ //會把Integer自動拆箱為 int再去比,等同于Integer in=10; Integer in=new Integer(10); int i=10; System.out.println(i==in);//true Integer i1=new Integer(20); Integer i2=20; System.out.println(i1==i2);//false Integer i3=new Integer(30); Integer i4=new Integer(30); System.out.println(i3==i4);//false Integer i5=40; Integer i6=40; System.out.println(i5==i6);//true System.out.println("================"); Integer i7=-127; Integer i8=-127; System.out.println(i7==i8);//true Integer i9=127; Integer i10=127; System.out.println(i9==i10);//true Integer i11=128; Integer i12=128; System.out.println(i11==i12);//false Integer i13=-128; Integer i14=-128; System.out.println(i13==i14);//true //Integer緩存區間[-128,127] 超出Integer的緩存范圍,不從私有靜態內部類IntegerCache的 數組cache中獲得,而是通過new返回新對象 Integer i131=-129; Integer i132=-129; System.out.println(i131==i132);//false Integer i15=250; Integer i16=250; System.out.println(i15==i16);//false }Integer源碼片段:
/* @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { //沒有設置的話,IngegerCache.high 默認是127 if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }對于–128到127(默認是127)之間的值,Integer.valueOf(int i) 返回的是緩存的Integer對象(并不是新建對象)而其他值,執行Integer.valueOf(int i) 返回的是一個新建的 Integer對象private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }看一下源碼大家都會明白,對于-128到127之間的數,會進行緩存. IntegerCache有靜態成員變量cache,為一個擁有256個元素的數組。在IntegerCache中也對cache進行了初始化,即第i個元素是值為i-128的Integer對象。而-128至127是最常用的Integer對象,這樣的做法也在很大程度上提高了性能.
針對以上案例分析得出如下結論:
1)Integer與new Integer不會相等,他們的內存地址不一樣 2)兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則為false 3)兩個都是new出來的,都為false 4)int和integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去做對比.
新聞熱點
疑難解答