常用類-包裝類
包裝類
概念
-
官方文件的
java.lang
包中可檢視 -
基本資料型別所對應的引用資料型別
-
Object
可統一所有類,包裝類的預設值為Null
-
對應關係
-
基本資料型別無方法可用,想使用方法需轉換成包裝型別,下圖為官方文件中的
Byte
類的部分方法
型別轉換與裝箱、拆箱
概念
-
基本資料型別儲存在棧空間中
-
引用型別資料儲存在堆空間中
-
裝箱、拆箱就是型別轉換
-
裝箱就是將基本型別轉換成引用型別的過程(基本型別轉換成包裝類)
-
拆箱就是將引用型別轉換成基本型別的過程(包裝類轉換成基本類)
-
八種包裝類提供不同型別間的轉換方式
-
Number
父類中提供六種共性方法 -
parseXXX()
靜態方法,引用型別轉換為基本型別 -
valueOf()
靜態方法,基本型別轉換為引用型別
-
-
注意:需保證型別相容,否則丟擲異常
String str = "12a"; int i3 = Integer.parseInt(str);
異常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"
int
、Integer
的轉換
-
Integer
的相關方法- 構造方法
- valueOf(int i)方法
- intValue()
-
裝箱
//裝箱:轉換成包裝類 //基本資料型別 int num1 = 1; //建立Integer類進行轉換 //1.用構造方法 Integer integer1 = new Integer(num1); //2.valueOf()方法 Integer integer2 = valueOf(num1);
-
拆箱
//拆箱:轉換成包裝類 //建立Integer例項 Integer integer3 = new Integer(2); //intValue()方法 int num2 = integer3.intValue();
-
JDK1.5之後提供自動裝箱和拆箱
//基本資料型別 int num1 = 1; //自動裝箱 Integer integer4 = num1; //自動拆箱 int num4 = integer4;
基本型別和字串之間的轉換
-
基本型別轉成String
//1.基本型別轉換成String int num = 10; //1.1 加"" String s1 = num+""; //1.2 靜態方法valueOf() String s2 = valueOf(num); //1.3 Integer的toString() Integer i1 = new Integer(num); String s3 = i1.toString();
-
String轉換成基本型別
//2.String轉換成基本型別 String str = "12"; //2.1靜態方法parseXXX() int i2 = parseInt(str); //2.2Integer的parseInt int i3 = Integer.parseInt(str);
-
boolean的特殊情況
//3.注意boolean字串形式轉成基本型別,"true"-->true,非"true"-->false String str1 = "true"; String str2 = "yes"; String str3 = "false"; //用Boolean的parseBoolean方法 boolean b1 = Boolean.parseBoolean(str1); boolean b2 = Boolean.parseBoolean(str2); boolean b3 = Boolean.parseBoolean(str3); System.out.println(b1);//輸出為true System.out.println(b2);//輸出為false System.out.println(b3);//輸出為false
整數緩衝區
概述
-
Java預先建立了256個常用的證書包裝類物件
-
在實際應用中對已建立的物件進行復用
面試題
-
程式碼
//面試題,判斷值相同的兩個Integer例項是否相等 //1.通過new Integer物件 Integer integer1 = new Integer(100); Integer integer2 = new Integer(100); System.out.println(integer1 == integer2);//輸出為false //2.自動裝箱,值為100 Integer integer3 = 100; Integer integer4 = 100; System.out.println(integer3 == integer4);//輸出為true //3.自動裝箱,值為200 Integer integer5 = 200; Integer integer6 = 200; System.out.println(integer5 == integer6);//輸出為false
-
分析
-
將.class檔案反編譯(拖入XJad中),發現自動裝箱使用的是
valueOf()
方法 -
檢視
Integer
的valueOf()
原始碼public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
發現
Integer
存在緩衝區(以陣列的形式存在於堆中),大於low
、小於high
的數直接返回緩衝區中的值,否則才建立新物件 -
進一步檢視原始碼
low=-128
,high=127
,即Integer
緩衝區包括大於-129,小於128的256個數,在這個範圍內的數值相同時,引用地址也相同 -
題目解析
-
1.通過
new Integer
建立了兩個例項,實質是在堆空間中開闢了兩個空間,在棧空間中的引用指向不同地址,所以兩個物件不相等,返回false -
2.通過自動裝箱即
valueOf()
方法,值為100,此時因為100處於整數緩衝區內,直接返回緩衝區中的地址,integer3
與integer4
的引用地址相同,所用相等 -
3.通過自動裝箱即
valueOf()
方法,值為200,此時因為200不在整數緩衝區內,所以要新建兩個物件,在堆中開闢兩個空間,所以引用地址不同,兩個值不相等
-
-