天天看點

java基本類型、對應的包裝類型(自動拆箱和自動裝箱)

什麼是自動裝箱和拆箱?

      自動裝箱就是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):把給定的字元轉換為小寫。