Java Integer 與 int 深刻理解


 

  今天在做Object 自動轉為Integer 類型之后的判斷,遇到一個不理解的點,當數值超過127之后,兩個數值相同的Object 對象用 == 判斷的結果是false。

 1      Object a = 128;
 2         Object b = 128;
 3         
 4         System.out.println(a.getClass().getName());
 5         System.out.println(b.getClass().getName());
 6         System.out.println(a==b);
 7         
 8         
 9         Object a1 = 127;
10         Object b1 = 127;
11         
12         System.out.println(a1.getClass().getName());
13         System.out.println(b1.getClass().getName());
14         System.out.println(a1==b1);
15         
16         int a2 = 128;
17         int b2 = 128;
18         
19         System.out.println(a2==b2);

結果:

false
true
true

 

之前隱約記得數值在 -128 與 127之間時,Integer 對象會特別處理,但是具體怎么處理的忘記了,網上查了些資料終於明白背后的設計原理了。

 

① Java 中的數據類型分為基本數據類型和引用數據類型

  int是基本數據類型,Integer是引用數據類型;

  Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null;

 

  ② 自動裝箱和拆箱

  從Java5.0版本以后加入了autoboxing功能,自動拆箱裝箱是依靠JDK的編譯器在編譯期的預處理工作。

  A. 自動裝箱:將基本數據類型封裝為對象類型,成為一個對象以后就可以調用對象所聲明的所有的方法。

   Integer inA = 127;
    //以上的聲明就是用到了自動的裝箱:解析為
    Integer inA = new Integer(127);

  B. 自動拆箱:將對象重新轉化為基本數據類型。

  //裝箱
   Integer inB = 128;
   //拆箱
   int inC = inB;

  C. 自動拆箱很典型的用法就是在進行運算的時候:因為對象不能直接進行運算,需要轉化為基本數據類型后才能進行加減乘除。

Integer inD = 128;
System.out.println(inD--);

  

  ③ 回到我遇到的問題:為什么數值在 -128 與 127之間時,兩個Integer 對象是否相等可以用 ==來判斷,但是這個范圍之外的就不能了呢?

這是因為Java對於Integer 與int 的自動裝箱與拆箱的設計,是一種模式:享元模式(flyweight),為了加大對簡單數字的重利用,Java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱為Integer對象后,會存在內存中被重用,始終只存在一個對象。而如果超過了這之間的值,被裝箱后的Integer 對象並不會被重用,即相當於每次裝箱時都新建一個 Integer對象;

以上的現象是由於使用了自動裝箱所引起的,如果你沒有使用自動裝箱,而是跟一般類一樣,用new來進行實例化,就會每次new就都一個新的對象;這個的自動裝箱拆箱不僅在基本數據類型中有應用,在String類中也有應用。

 

④ 包裝類

所有基本類型都有一個與之對應的類,即包裝類;是不可變類;包裝類是final的,不能定義他們的子類。

基本數據類型

包裝類

byte

java.lang.Byte

boolean

java.lang.Boolean

short

java.lang.Short

char

java.lang.Character

int

java.lang.Integer

long

java.lang.Long

float

java.lang.Float

double

java.lang.Double

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM