包装类
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对象
}