天天看點

Integer與int的種種比較

Integer與int的種種比較

  

 ​​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

如果面試官問Integer與int的差別:估計大多數人隻會說道兩點,Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。但是如果面試官再問一下Integer i = 1;int ii = 1; i==ii為true還是為false?估計就有一部分人答不出來了,如果再問一下其他的,估計更多的人會頭腦一片混亂。是以我對它們進行了總結,希望對大家有幫助。

  首先看代碼:

1 package com.test;
 2 /**
 3  * 
 4  * @author 劉玲
 5  *
 6  */
 7 public class TestInteger {
 8 
 9     /**
10      * @param args
11      */
12     public static void main(String[] args) {
13         int i = 128;
14         Integer i2 = 128;
15         Integer i3 = new Integer(128);
16         //Integer會自動拆箱為int,是以為true
17         System.out.println(i == i2);
18         System.out.println(i == i3);
19         System.out.println("**************");
20         Integer i5 = 127;//java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);
21         Integer i6 = 127;
22         System.out.println(i5 == i6);//true
23         /*Integer i5 = 128;
24         Integer i6 = 128;
25         System.out.println(i5 == i6);//false
26 */        Integer ii5 = new Integer(127);
27         System.out.println(i5 == ii5); //false
28         Integer i7 = new Integer(128);
29         Integer i8 = new Integer(123);
30         System.out.println(i7 == i8);  //false
31     }
32 
33 }      

首先,17行和18行輸出結果都為true,因為Integer和int比都會自動拆箱(jdk1.5以上)。

22行的結果為true,而25行則為false,很多人都不動為什麼。其實java在編譯Integer i5 = 127的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);是以關鍵就是看valueOf()函數了。隻要看看valueOf()函數的源碼就會明白了。JDK源碼的valueOf函數式這樣的:

1 public static Integer valueOf(int i) {
2         assert IntegerCache.high >= 127;
3         if (i >= IntegerCache.low && i <= IntegerCache.high)
4             return IntegerCache.cache[i + (-IntegerCache.low)];
5         return new Integer(i);
6     }      

看一下源碼大家都會明白,對于-128到127之間的數,會進行緩存,Integer i5 = 127時,會将127進行緩存,下次再寫Integer i6 = 127時,就會直接從緩存中取,就不會new了。是以22行的結果為true,而25行為false。

對于27行和30行,因為對象不一樣,是以為false。

我對于以上的情況總結如下:

  ①無論如何,Integer與new Integer不會相等。不會經曆拆箱過程,i3的引用指向堆,而i4指向專門存放他的記憶體(常量池),他們的記憶體位址不一樣,是以為false

  ②兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則為false

  java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存

  ③兩個都是new出來的,都為false

  ④int和integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比

結論:

1.new出來的Integer相比較,均為false,代表兩個不同的對象,存儲在堆中的位置不一樣。

2.非new出來的Integer相比較,如果數在-128到127之間,則是true,否則為false 。

3.int和Integer相比較,均為ture,因為Integer會先自動拆箱為int,再進行比較。

4.Integer和new Integer相比較,均為false。

   如果值在-128到127之間,Integer的值存在于常量池,new Integer的值存在于堆中;

   如果沒在-128到127之間,那麼均視為new Integer,同結論1。