程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java 自動裝箱自動拆箱,java裝箱

java 自動裝箱自動拆箱,java裝箱

編輯:JAVA綜合教程

java 自動裝箱自動拆箱,java裝箱


 1.Java數據類型

       在介紹Java的自動裝箱和拆箱之前,我們先來了解一下Java的基本數據類型。

       在Java中,數據類型可以分為兩大種,Primitive Type(基本類型)和Reference Type(引用類型)。基本類型的數值不是對象,不能調用對象的toString()、hashCode()、getClass()、equals()等方法。所以Java提供了針對每種基本類型的包裝類型。如下:

 

 

Java基本數據類型 INDEX 基本類型  大小 數值范圍 默認值 包裝類型 1 boolean    --- true,false false Boolean 2 byte 8bit -2^7 -- 2^7-1 0 Byte 3 char 16bit
\u0000 - \uffff
\u0000 Character 4 short 16bit -2^15 -- 2^15-1 0 Short 5 int  32bit -2^31 -- 2^31-1 0 Integer 6 long 64bit -2^63 -- 2^63-1 0 Long 7 float  32bit IEEE 754 0.0f Float 8 double  64bit IEEE 754 0.0d Double 9 void     ---     --- --- Void

2.Java自動裝箱和拆箱定義

   Java 1.5中引入了自動裝箱和拆箱機制:

       (1)自動裝箱:把基本類型用它們對應的引用類型包裝起來,使它們具有對象的特質,可以調用toString()、hashCode()、getClass()、equals()等方法。

        如下:

Integer a=3;//這是自動裝箱

        其實編譯器調用的是static Integer valueOf(int i)這個方法,valueOf(int i)返回一個表示指定int值的Integer對象,那麼就變成這樣: 

Integer a=3;   =>    Integer a=Integer.valueOf(3);

 

        (2)自動拆箱:跟自動裝箱的方向相反,將Integer及Double這樣的引用類型的對象重新簡化為基本類型的數據。

         如下:

 int i = new Integer(2);//這是拆箱

         編譯器內部會調用int intValue()返回該Integer對象的int值

         注意:自動裝箱和拆箱是由編譯器來完成的,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動作。

 

 3.基本數據類型與對象的差別 

  • 基本數據類型不是對象,也就是使用int、double、boolean等定義的變量、常量。
  • 基本數據類型沒有可調用的方法
 eg:  int t = 1;     t.  後面是沒有方法。

 Integer t =1; t.  後面就有很多方法可讓你調用了。

 

4.什麼時候自動裝箱

Integer i = 10; //裝箱 
int t = i; //拆箱,實際上執行了 int t = i.intValue();

 

   在進行運算時,也可以進行拆箱。 

Integer i = 10; 
System.out.println(i++);

 

5.什麼時候自動裝箱

復制代碼
//在-128~127 之外的數
 Integer i1 =200;  
 Integer i2 =200;          
 System.out.println("i1==i2: "+(i1==i2));                   
 // 在-128~127 之內的數
 Integer i3 =100;  
 Integer i4 =100;  
 System.out.println("i3==i4: "+(i3==i4));
復制代碼
輸出的結果
 i1==i2: false
 i3==i4: true

 

說明

  equals() 比較的是兩個對象的值(內容)是否相同。

  "==" 比較的是兩個對象的引用(內存地址)是否相同,也用來比較兩個基本數據類型的變量值是否相等。

 

  前面說過,int 的自動裝箱,是系統執行了 Integer.valueOf(int i),先看看Integer.java的源碼:

復制代碼
public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)  // 沒有設置的話,IngegerCache.high 默認是127
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}
復制代碼

  對於–128到127(默認是127)之間的值,Integer.valueOf(int i) 返回的是緩存的Integer對象(並不是新建對象)

  所以范例中,i3 與 i4實際上是指向同一個對象。

  而其他值,執行Integer.valueOf(int i) 返回的是一個新建的 Integer對象,所以范例中,i1與i2 指向的是不同的對象。

  當然,當不使用自動裝箱功能的時候,情況與普通類對象一樣,請看下例:

Integer i3 =new Integer(100); 
Integer i4 =new Integer(100); 
System.out.println("i3==i4: "+(i3==i4));//顯示false

 

  致謝:感謝您的耐心閱讀!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved