什麼是自動裝箱和拆箱?
自動裝箱就是Java自動将原始類型值轉換成對應的包裝類型,如将int的變量轉換成Integer對象,這個過程叫做裝箱。反之将Integer引用類型轉換成int類型值,這個過程叫做拆箱。因為裝箱和拆箱是自動進行的非人為轉換,是以就稱作為自動裝箱和拆箱。
基本資料類型:byte,short,char,int,long,float,double、boolean
對應的封裝類為:Byte,Short,Character,Integer,Long,Float,Double,Boolean
自動裝箱時編譯器調用valueOf将基本類型值轉換成引用類型。
自動拆箱時,編譯器通過調用類似intValue(),doubleValue()這類的方法将對象轉換成原始類型值。
//把int類型轉換為Integer類型:
int i = ;
Integer num = Integer.valueOf(i);
//把Integer類型轉換為int類型
int i = num.intValue();
自動裝箱的弊端有哪些?
1、在一個循環中進行自動裝箱操作的時候,會建立多餘的對象,會影響程式的性能。
Integer sum = ;
for(int i = ;i < ;i++{
sum += i;
}
代碼sum += i 可以看成sum = sum + i,但是 + 操作符不适用于Integer對象,是以就會對sum先進性自動拆箱操作,然後進行數值相加操作,最後發生自動裝箱操作轉換成Integer對象。
通過XJad反編譯軟體我們可以看到源碼是這樣的:
Integer sum = Integer.valueOf();
for (int i = ; i < ; i++){
sum = Integer.valueOf(sum.intValue() + i);
}
由于我們這裡聲明的sum是Integer類型,在上面循環中我們或建立幾乎100個沒有用的Integer對象,會降低程式的性能,并且還加重了垃圾回收的工作量。
2、當一個對象和一個原始資料值進行比較時,如果這個對象沒有進行初始化或者為null,在自動拆箱中會抛出NullPointerException。是以今後我們在進行操作對象的時候要首先判斷是否為null
private static Integer count;
public static void main(String[] args) {
if(count <= ){
System.out.println("Count is not started yet");
}
}
将基本資料類型封裝成對象有什麼好處?
1、為了對基本類型進行更多的操作,更友善的操作,java針對每一種基本資料類型提供了對應的類類型,即包裝類類型。
2、可以用于基本資料類型和字元串之間的轉換
int類型和String類型的互相轉換:
int類型轉換為String類型:
(1) 通過拼接一個空字元串。也就是number+”“的形式
(2) 通過String類的valueOf方法。也就是String.valueOf(number)(推薦)
public static String valueOf(T l):傳回 參數的字元串表示形式。
(3) 通過轉換為Integer對象,然後調用toString()方法。(不推薦)
public String toString():傳回一個表示該 Integer 值的 String 對象。
(4)調用Integer的toString(int i)方法
public static String toString(int i):傳回一個表示指定整數的 String 對象
String s1 = "" + number; //法一
System.out.println("s1:" + s1);
String s2 = String.valueOf(number); //法二
System.out.println("s2:" + s2);
Integer i = new Integer(number); //法三
String s3 = i.toString();
System.out.println("s3:" + s3);
String s4 = Integer.toString(number); //法四
System.out.println("s4:" + s4);
String類型轉換為int類型:
String s = "100";
Integer i = new Integer(s); //法一
int x = i.intValue();
System.out.println("x:" + x);
int ii = Integer.parseInt(s); //法二<font color="red">(推薦)</font>
System.out.println("ii:" + ii);
Integer類:java.lang
構造方法:
public Integer(int value):構造一個新配置設定的 Integer 對象,它表示指定的 int 值。
public Integer(String s) throws NumberFormatException:這個字元串必須是由數字組成。
十進制轉換為其他進制:
public static String toBinaryString(int i):以二進制(基數 2)無符号整數形式傳回一個整數參數的字元串表示形式。
public static String toOctalString(int i):以八進制(基數 8)無符号整數形式傳回一個整數參數的字元串表示形式。
public static String toHexString(int i):以十六進制(基數 16)無符号整數形式傳回一個整數參數的字元串表示形式。
public static String toString(int i,int radix):傳回用第二個參數指定基數(2進制、8進制等)表示的第一個參數的字元串表示形式。
進制的範圍:2-36(因為0-9 a-z總共有36個)
其他進制轉換為十進制:
public static int parseInt(String s,int radix) throws NumberFormatException:使用第二個參數指定的基數,将字元串參數解析為有符号的整數。
範圍:
public static final int MAX_VALUE:值為 231-1 的常量,它表示 int 類型能夠表示的最大值。
public static final int MIN_VALUE:值為 -231 的常量,它表示 int 類型能夠表示的最小值。
Character類:java.lang
public static boolean isLowerCase(char ch):确定指定字元是否為小寫字母。
public static boolean isUpperCase(char ch):确定指定字元是否為大寫字母。
public static boolean isDigit(char ch):确定指定字元是否為數字。
public static char toUpperCase(char ch):把給定的字元轉換為大寫。
public static char toLowerCase(char ch):把給定的字元轉換為小寫。