包裝類
包裝類的簡介
Java是一種面向對象的語言,但是不是純面向對象,Java中的數據類型分爲基本數據類型和引用數據類型,其中基本數據類型就不是對象,它不具有屬性和方法;Java在設計類時爲每個基本數據類型設計了一個對應的類進行代表,這些和基本數據類型相對應的類統稱爲包裝類
基本數據類型 | 包裝類 |
---|---|
int | Integer |
char | Character |
long | Long |
double | Double |
float | Float |
short | Short |
boolean | Boolean |
byte | Byte |
.
所有的包裝類都是由final修飾的,除了Character和Boolean以外,其他的都是“數字型”,“數字型”都是java.lang.Number的子類。Number類是抽象類,因此它的抽象方法,所有子類都需要提供實現。
Number類提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味着所有的“數字型”包裝類都可以互相轉型。
包裝類的使用
包裝類的用途
作用:
- 作爲和基本數據類型對應的類型存在,方便涉及到對象的操作
- 提供每種基本數據類型的相關屬性如最大值、最小值等以及相關的操作方法,這些操作方法的作用是在基本數據類型、包裝對象、字符串之間提供相互之間的轉化
public static void main(String[] args) {
Integer aInteger = new Integer(6);
Integer bInteger = Integer.valueOf(66); //將基本數據類型轉化成包裝類對象
double d = bInteger.doubleValue();
int c = bInteger.intValue(); //將包裝類對象轉成基本數據類型
Integer eInteger = new Integer("66");
Integer fInteger = Integer.parseInt("66");//將字符串轉化包裝類對象
String string = fInteger.toString();
String string1 = ""+fInteger; //將包裝類對象轉化成字符串
System.out.println("int類型最小的整數" + Integer.MIN_VALUE);
System.out.println("int類型最大的整數" + Integer.MAX_VALUE);//包裝類中常見的常量
}
int類型的最大整數和最小整數
裝箱與拆箱
裝箱和拆箱就是將基本數據類型和包裝類之間進行的互相轉換
裝箱與拆箱分爲手動和自動兩種方式( JDK1.5後,Java引入了自動裝箱與拆箱)
裝箱(autoboxing):
將基本數據類型轉化爲對象;
- 手動裝箱:
Integer aInteger = new Integer(6);
- 自動裝箱:
Integer aInteger = 6;
(JDK1.5後JVM自動爲我們執行了Integer aInteger = Integer.valueOf(6)操作)
拆箱(unboxing):
當需要一個基本數據類型時,對象轉化爲基本數據類型;
- 手動裝箱:
Integer aInteger = Integer.intValue();
- 自動裝箱:
Integer aInteger = 6; int b = aInteger;
(自動裝箱不需要顯式調用 基本數據類型Value()轉型方法)
包裝類空指針異常問題
當包裝類對象爲空時,自動拆箱時報錯
解決方法:
public static void main(String[] args) {
Integer a = null;
if (a != null) { //加判斷後在進行自動拆箱
int b = a;
}
}
包裝類的緩存問題
緩存處理的原理爲:如果數據在 -128~127 這個區間,那麼在類加載時就已經爲該區間的每個數值創建了對象,並將這256個對象存放到一個名爲cache的數組中。每當自動裝箱過程發生時(或者手動調用valueOf()時),就會先判斷數據是否在該區間,如果在則直接獲取數組中對應的包裝類對象的引用,如果不在該區間,則會通過new調用包裝類的構造方法來創建對象。
public static void main(String[] args) {
Integer aInteger = -111;
Integer bInteger = Integer.valueOf(-111);
System.out.println(aInteger == bInteger);//當數組在緩衝範圍內,則會從緩衝區去獲取對應的Integer對象
System.out.println(aInteger.equals(bInteger));
Integer cInteger = 1111;
Integer dInteger = Integer.valueOf(1111);
System.out.println(cInteger == dInteger); //因爲不在緩存範圍內,通過new調用了包裝類中的構造方法創建了對象開闢了兩塊不同的區域,所以爲false
System.out.println(cInteger.equals(dInteger));
}
包裝類的緩存問題實際上就是系統初始化的時候創建了-128到127之間的緩存數組,當調用valueOf()的時候,首先檢查是都在-128~127之間,在這個範圍內則直接從緩存數組中取出已經建好的對象;若不在這個範圍內,則創建新的Integer對象
包裝類的常用方法
方法名稱 | 方法作用 |
---|---|
intValue() | 包裝類轉爲int類型 |
valueOf() | int類型轉包裝類 |
parseInt() | 字符串轉int類型 |
toString() | 包裝類轉爲字符串 |