Integer類入門學習

Integer類

它是一個類,是 int 基本數據類型的封裝類。java

基本API

img

img

img

img

img


Integer 類和 int 的區別

  1. Integer 是 int 包裝類,int 是八大基本數據類型之一(byte,short,int,long,char,float,double,boolean)
  2. Integer 是類,默認值爲null,int是基本數據類型,默認值爲0;
  3. Integer 表示的是對象,用一個引用指向這個對象,而int是基本數據類型,直接存儲數值.

Integer 的自動拆箱和裝箱

自動拆箱和自動裝箱是 JDK1.5 之後纔有的功能,也就是java當中衆多的語法糖之一,它的執行是在編譯期,會根據代碼的語法,在生成class文件的時候,決定是否進行拆箱和裝箱動做。api

自動裝箱

通常咱們建立一個類的時候是經過new關鍵字,好比:緩存

Object obj = new Object();

可是對於 Integer 類,咱們卻能夠這樣:工具

Integer a = 128;

爲何能夠這樣,經過反編譯工具,咱們能夠看到,生成的class文件是:學習

Integer a = Integer.valueOf(128);

這就是基本數據類型的自動裝箱,128是基本數據類型,而後被解析成Integer類。測試

自動拆箱

咱們將 Integer 類表示的數據賦值給基本數據類型int,就執行了自動拆箱。code

Integer a = new Integer(128);
int m = a;

反編譯生成的class文件:對象

Integer a = new Integer(128);
int m = a.intValue();

簡單來說:自動裝箱就是Integer.valueOf(int i);自動拆箱就是 i.intValue();blog

思考下面的問題:

public static void main(String[] args) {
    Integer i = 10;
    Integer j = 10;
    System.out.println(i == j);//true
      
    Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);//false
     
    int k = 10;
    System.out.println(k == i);//true
    int kk = 128;
    System.out.println(kk == a);//true
      
    Integer m = new Integer(10);
    Integer n = new Integer(10);
    System.out.println(m == n);//false
}

咱們使用反編譯工具Jad,獲得的代碼以下:get

public static void main(String args[])
{
    Integer i = Integer.valueOf(10);
    Integer j = Integer.valueOf(10);
    System.out.println(i == j);
    Integer a = Integer.valueOf(128);
    Integer b = Integer.valueOf(128);
    System.out.println(a == b);
    int k = 10;
    System.out.println(k == i.intValue());
    int kk = 128;
    System.out.println(kk == a.intValue());
    Integer m = new Integer(10);
    Integer n = new Integer(10);
    System.out.println(m == n);
}

首先,直接聲明Integer i = 10,會自動裝箱變爲Integer i = Integer.valueOf(10);Integer i 會自動拆箱爲 i.intValue()。

  1. 第一個打印結果爲 true

    對於 i == j ,咱們知道這是兩個Integer類,他們比較應該是用equals,這裏用==比較的是地址,那麼結果確定爲false,可是實際上結果爲true,這是爲何?

    咱們進入到Integer 類的valueOf()方法:

    img

    分析源碼咱們能夠知道在 i >= -128 而且 i <= 127 的時候,第一次聲明會將 i 的值放入緩存中,第二次直接取緩存裏面的數據,而不是從新建立一個Ingeter 對象。那麼第一個打印結果由於 i = 10 在緩存表示範圍內,因此爲 true。

  2. 第二個打印結果爲 false

    從上面的分析咱們知道,128是不在-128到127之間的,因此第一次建立對象的時候沒有緩存,第二次建立了一個新的Integer對象。故打印結果爲false

  3. 第三個打印結果爲 true

    Integer 的自動拆箱功能,也就是比較兩個基本數據類型,結果固然爲true

  4. 第四個打印結果爲 true

     解釋和第三個同樣。int和integer(不管new否)比,都爲true,由於會把Integer自動拆箱爲int再去比較。

  5. 第五個打印結果爲 false

    由於這個雖然值爲10,可是咱們都是經過 new 關鍵字來建立的兩個對象,是不存在緩存的概念的。兩個用new關鍵字建立的對象用 == 進行比較,結果固然爲 false。

測試一下:

Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
 
Integer e = 321;
Integer f = 321;
 
Long g = 3L;
Long h = 2L;
 
System.out.println(c == d);//true
System.out.println(e == f);//false
System.out.println(c == (a + b));//true
System.out.println(c.equals((a+b)));//true
System.out.println(g == (a+b));//true
System.out.println(g.equals(a+b));//false
System.out.println(g.equals(a+h));//true

反編譯結果:

img

分析:

第一個和第二個結果沒什麼疑問,Integer類在-128到127的緩存問題;

第三個因爲a+b包含了算術運算,所以會觸發自動拆箱過程(會調用intValue方法),==比較符又將左邊的自動拆箱,所以它們比較的是數值是否相等。

第五個對於 g == (a+b),首先計算 a+b,也是先調用各自的intValue方法,獲得數值以後,因爲前面的g是Long類型的,也會自動拆箱爲long,==運算符能將隱含的將小範圍的數據類型轉換爲大範圍的數據類型,也就是int會被轉換成long類型,兩個long類型的數值進行比較。

第六個對於 g.equals(a+b),同理a+b會先自動拆箱,而後將結果自動裝箱,須要說明的是 equals 運算符不會進行類型轉換。因此是Long.equals(Integer),結果固然是false

第七個對於g.equals(a+h),運算符+會進行類型轉換,a+h各自拆箱以後是int+long,結果是long,而後long進行自動裝箱爲Long,兩個Long進行equals判斷。

結尾:

目前暫時瞭解這些吧,之後深刻學習時再補充~~~

相關文章
相關標籤/搜索