天天看點

對象包裝器與自動裝箱(Java的128陷阱)

有時, 需要将 int 這樣的基本類型轉換為對象。 所有的基本類型都冇一個與之對應的類。

例如,Integer 類對應基本類型 int。通常,這些類稱為包裝器 ( wrapper ) 這些對象包裝器類擁有很明顯的名字:Integer、Long、Float、Double、Short、Byte、Character 、Void 和 Boolean (前6 個類派生于公共的超類 Number)。對象包裝器類是不可變的,即一旦構造了包裝器,就不允許更改包裝在其中的值。同時, 對象包裝器類還是 final , 是以不能定義它們的子類。

假設想定義一個整型數組清單。而尖括号中的類型參數不允許是基本類型,也就是說,不允許寫成 ArrayList<int>。這裡就用到了 Integer 對象包裝器類。我們可以聲明一個 Integer對象的數組清單。

ArrayList<Integer> list = new ArrayList<>();           

幸運的是, 有一個很有用的特性, 進而更加便于添加 int 類型的元素到 ArrayLis<lnteger>中。下面這個調用

list.add(3);           

将自動地變換成

list.add (Integer.value0f(3));           

這種變換被稱為自動裝箱(autoboxing)。

要注意:自動裝箱規範要求 boolean、byte、char 127, 介于 -128 ~ 127 之間的 short 和int 被包裝到固定的對象中。例如,如果在前面的例子中将 a 和 b 初始化為 100,對它們進行比較的結果一定成立。

public static void main(String[] args) throws Exception{
    Integer a = 127;
    Integer b = 127;

	Integer a1 = 128;
	Integer b1 = 128;

	System.out.println(a == b);		//true
	System.out.println(a1 == b1);	    //false
}           

最後強調一下,裝箱和拆箱是編譯器認可的,而不是虛拟機。編譯器在生成類的位元組碼時, 插人必要的方法調用。虛拟機隻是執行這些位元組碼。

int intValue( )           

以 int 的形式傳回 Integer 對象的值(在 Number 類中覆寫了 intValue方法)。

下面是Integer類的常用方法:

static String toString(int i ) 以一個新 String 對象的形式傳回給定數值 i 的十進制表示。
static String toString(int i ,int radix ) 傳回數值 i 的基于給定 radix 參數進制的表示。

static int parselnt(String s)

static int parseInt(String s,int radix)

傳回字元串 s 表示的整型數值, 給定字元串表示的是十進制的整數(第一種方法,)

或者是 radix 參數進制的整數(第二種方法 。)

static Integer valueOf(String s)

Static Integer value Of(String s, int radix)

傳回用 s 表示的整型數值進行初始化後的一個新 Integer 對象, 給定字元串表示的是十

進制的整數(第一種方法,)或者是 radix 參數進制的整數(第二種方法。)

Number parse(String s) 傳回數字值,假設給定的 String 表示了一個數值。
public static void main(String[] args) throws Exception{
	Integer a = 127;
	int a1 = a.intValue();
	System.out.println(a1);		//127

	int b = 126;
	String b1 = Integer.toString(b);
	String b2 = Integer.toString(b,16);
	System.out.println(b1);		//126
	System.out.println(b2);		//7e

	String c = "126";
	int c1 = Integer.parseInt(c);
	int c2 = Integer.parseInt(c,8);
	System.out.println(c1);		//126	
	System.out.println(c2);		//86

	String d = "127";
	Integer d1 = Integer.valueOf(d);
	Integer d2 = Integer.valueOf(d);
	System.out.println(d1);		//127
	System.out.println(d2);		//127
}