包裝類
1. 包裝類的使用:
Java提供了8種基本數據類型對應的包裝類,使得基本數據類型的變量具有類的特徵
2. 基本數據類型、包裝類、String三者之間的相互轉換
注:【實際上JDK5.0以後有了自動裝箱、自動拆箱功能後,基本數據類型和包裝類可以合二爲一,二者在實際開發過程中可以看作是一種東西】
實例:
import java.util.Scanner;
import java.util.Vector;
import org.junit.Test;
/*
* 包裝類的使用:
*
* 1. Java提供了8種基本數據類型對應的包裝類,使得基本數據類型的變量具有類的特徵
*
* 2. 基本數據類型、包裝類、String三者之間的相互轉換
*/
public class WrapperTest {
//基本數據類型--->包裝類:調用包裝類的構造器
//【有些方法的形參是引用類型,比如Object類型,就需要把基本數據類型轉化爲包裝類,再傳參】
@Test
public void test1(){
int num1 = 10;
Integer in1 = new Integer(num1);
System.out.println(in1.toString());
Integer in2 = new Integer("234"); //注意,該字符串內容必須是純粹的數,不能是"123abc"
System.out.println(in2.toString());
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("true");
Boolean b3 = new Boolean("true123"); //這裏不同於其他類型,不報異常,而是輸出false
System.out.println(b3);
}
@Test
public void test2(){
Integer in1 = new Integer(10);
int num1 = in1.intValue();
System.out.println(num1 + 1);
Boolean b1 = new Boolean(true);
boolean flag = b1.booleanValue();
System.out.println(flag);
}
//JDK5.0新增新特性:自動裝箱與自動拆箱
//【包裝類和基本數據類型之間的轉換,十分常用,因此增加自動裝箱拆箱,使得二者的轉化過程更加平滑(隱藏了複雜過程)】
//【有了自動裝箱與拆箱技術後,基本數據類型 和 包裝類 就可以看成一個東西了】
@Test
public void test3(){
//自動裝箱:基本數據類型--->包裝類
int num1 = 10;
Integer in1 = num1;
boolean b1 = true;
Boolean flag = b1;
//自動拆箱:包裝類--->基本數據類型
int num2 = in1;
}
//基本數據類型、包裝類--->String類型:調用String中重載的valueOf(Xxx xxx)方法
//【轉化成誰,就去誰裏面找方法】
@Test
public void test4(){
//方式一:連接運算
int num1 = 10;
String str1 = num1 + "";
//方式二:調用String的valueOf()方法
float f1 = 12.3F;
String str2 = String.valueOf(f1); //"12.3"
Double d1 = new Double(22.4);
String str3 = String.valueOf(d1); //"22.4"
}
//包裝類--->基本數據類型:調用包裝類的xxxValue
//【包裝類作爲引用類型,是不能進行加減乘除運算的,因此需要轉化回基本數據類型,才能運算】
//String類型--->基本數據類型、包裝類:調用包裝類的parseXxx()方法
@Test
public void test5(){
String str1 = "123";
int num1 = Integer.valueOf(str1);
int num2 = Integer.parseInt(str1);
String str2 = "true";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(b1);
}
}
3. 面試題
知識點:
- 包裝類 Integer 內部定義了IntegerCache結構,其中定義了一個Integer[]數組,保存了常用的整數[-128, 127],方便使用,(因爲很常用,所以就別每次新創建、銷燬這麼麻煩了,提前加載好就是);
- 因此,如果我們使用自動裝箱的方式(即,不是new的),給Integer賦值的範圍在-128~127範圍內,就可以直接使用數組中的元素,不用再new了;超出這個範圍的數,則按正常流程去new一個Integer對象;
//面試題:
@Test
public void interviewTest(){
//面試題1:
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1); //1.0
//【三目運算符,在編譯的時候,就要對前後兩個變量進行類型統一,就會進行類型提升】
Object o2;
if(true){
o2 = new Integer(1);
}else{
o2 = new Double(2.0);
}
System.out.println(o2);
//面試題2:
Integer in1 = 1;
Integer in2 = 1;
Integer a = 128;
Integer b = 128;
System.out.println(in1 == in2); //true
System.out.println(a == b); //false
//Integer內部定義了IntegerCache結構,其中定義了一個Integer[]數組,保存了常用的整數[-128, 127],方便使用
//(因爲很常用,所以就別每次新創建、銷燬這麼麻煩了,提前加載好就是)
//因此,如果我們使用自動裝箱的方式(即,不是new的),給Integer賦值的範圍在-128~127範圍內,就可以直接使用數組中的元素,不用再new了
//超出這個範圍的數,則按正常流程去new一個Integer對象
}