Java包裝類、自動拆裝箱
複習一下Java的基本數據類型、包裝類、自動裝/拆箱機制,以及一些面試的坑。
基本數據類型及其包裝類
在JAVA中一共有八種基本數據類型,他們分別是
byte、short、int、long、float、double、char、boolean 。
基本類型功能簡單,不具備對象的特性,爲了使基本類型具備對象的特性,所以出現了包裝類,就可以像操作對象一樣操作基本類型數據。
常用的包裝類可以分爲三類:Character、Number、Boolean。
Number類是所有數字型包裝類的父類。
基本類型與包裝類的對應關係如下:
byte | short | int | long | float | double | char | boolean | |
---|---|---|---|---|---|---|---|---|
位數 | 8 | 16 | 32 | 64 | 32 | 64 | 16 | 1 |
字節數 | 1 | 2 | 4 | 8 | 4 | 8 | 2 | 1(1/8) |
默認值 | 0 | 0 | 0 | 0L | 0.0f | 0.0d | false | |
包裝類型 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
裝/拆箱
Java提供的包裝類可以操作基本數據類型,最常用的是類型轉換。
JDK1.5就開始引入了自動拆裝箱的語法功能,也就是系統將自動進行基本數據類型和與之相對應的包裝類型之間的轉換,這使得程序員書寫代碼更加方便。
包裝類的基本方法
Number類:
1 xxxValue()
將 number 對象轉換爲xxx數據類型的值並返回。
2 compareTo()
將number對象與參數比較。
3 equals()
判斷number對象是否與參數相等。
4 valueOf()
返回一個 Number 對象指定的內置數據類型
5 toString()
以字符串形式返回值,Number類型方法,不是Object類的方法。
6 parseInt()
將字符串解析爲int類型。
包裝類的一些性質
- 所有包裝類都可以將與之對應的基本數據類型作爲參數來創建它們的實例對象
- 除了Character類之外,其他包裝類都可以將一個字符串作爲參數來構造它們的實例
- Boolean類的構造方法參數爲String類型時,若該字符串爲true(不論大小寫),則該對象表示true,否則表示false
- 當包裝類Number構造方法的參數爲String類型時,字符串不能爲null,並且該字符串必須能夠解析爲基本類型的數據
自動裝/拆箱如:
Integer integer=18;
System.out.println(integer);
//18是基本int類型,賦給其包裝類就是裝箱
Integer integer2=new Integer("19");//字符串作爲參數來構造實例
int i=integer2;
//integer2是對象,將其賦給int型就是拆箱
裝箱過程是通過調用包裝器的valueOf方法實現的,而拆箱過程是通過調用包裝器對象的 xxxValue方法實現的。
valueOf方法爲static方法。
int s1=Integer.parseInt("100"); //字符串被解析成int
System.out.println(s);//100
Integer s2= Integer.valueOf(1);//int包裝成Integer
System.out.println(s2);//1
//字符串先被parseInt(String s)方法解析爲int型,再被valueOf(int i)方法裝箱
Integer s3=Integer.valueOf("1");
System.out.println(s3);//1
Integer integer=18;//裝箱
int i=integer.intValue();//拆箱
System.out.println(i);
包裝器的public static String toString(int i)
方法可以方便的將Number類型轉換成String類型。
Integer integer=18;//裝箱
String s=Integer.toString(integer);//先拆箱再轉換
System.out.println(s);
String和包裝器轉換
toString和 parsexxx方法能夠將基本類型和String類型互相轉換,再通過拆裝箱就可以實現包裝器和String的互相轉換。
public static String toString(int i)
public static int parseInt(String s)
測試
System.out.println(String s)
是我們常用的方法,將Integer對象與字符串連接打印。
Integer i=100;//裝箱
System.out.println("hello "+i);//先拆箱再解析成String類型
這裏100被包裝成Integer對象i,與字符串"hello "拼接時被拆成基本類型int,之後int類型又被自動轉換成String類型。
面試題
經常看到面試題中對取值範圍及是否同一對象進行考察,這部分也記下來。
equals方法用於比較數據內容、==不僅比較數據內容還比較是否爲同一對象。
單純的比較數據和對象很容易。
int i1=97;
int i2=97;
int i3=197;
int i4=197;
//數據相同
System.out.println(i1==i2);//true
System.out.println(i3==i4);//true
Integer integer1=new Integer(97);
Integer integer2=new Integer(97);
Integer integer3=new Integer(197);
Integer integer4=new Integer(197);
//數據相同但不是同一個對象
System.out.println(integer1.equals(integer2));//true
System.out.println(integer1==integer2);//false
System.out.println(integer3.equals(integer4));//true
System.out.println(integer3==integer4);//false
結合拆裝箱的時候、有些東西就要注意了。
Integer l1=97;
Integer l2=97;
Integer l3=197;
Integer l4=197;
System.out.println(l1.equals(l2));//true
System.out.println(l1==l2);//true
System.out.println(l3.equals(l4));//true
System.out.println(l3==l4);//false
作爲常量時,對於-128到127之間的數,會進行緩存,當超過範圍就是new一個對象了.
Double l1=10000000000000000000000000000000000000000000000000000000000000d;
Double l2=10000000000000000000000000000000000000000000000000000000000000d;
Double l3=10d;
Double l4=10d;
System.out.println(l1.equals(l2));//true
System.out.println(l1==l2);//false
System.out.println(l3.equals(l4));//true
System.out.println(l3==l4);//false