Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
基本类型 | 对应的包装类(位于java.lang包中) |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
1、 八大数据类型的操作就可以像操作对象一样操作。
2、 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
3、 基本类型和包装类之间可以互相转换。
4、 通过包装类,String可以和基本类型之间相互转换。
5、 集合不允许存放基本数据类型,故常用包装类
基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:
用Integer与 int为例:
基本数值---->包装对象
Integer i = new Integer(4);//使用构造函数函数
Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法
包装对象---->基本数值
int num = i.intValue();
由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。
直接赋值:自动装箱和拆箱能像基本数据类型一样直接赋值,无需自己去创建包装类对象。
/*
装箱
*/
// jdk1.5以前,需手动装箱
Integer a = new Integer(23);
// jdj1.5以后,自动装箱
Integer b = 23;
/*
拆箱
*/
// jdk1.5以前,需手动拆箱
int a1 = a.intValue();
// jdk1.5以后,自动拆箱
int b1 = b;
做运算:对象之间不能使用+、-、*、/等运算符,包装类对象自动拆箱便可以了
/*
* 装箱
*/
Integer a = new Integer(23);
Integer b = new Integer(3);
// jdk1.5之前,包装类对象不能直接做运算
// jdk1.5之后,能直接做运算
int c = a + b;
Integer d = a + c;
方法调用传参上:方法调用传参时,我们可以传入原始数据值或者对象,编译器和自动转换
// 参数列表要求传的是int类型
public static int zhuangXiang(int i) {
return i;
}
// 参数列表要求传的是Integer包装类对象
public static Integer chaiXiang(Integer i) {
return i;
}
/*
* 装箱
*/
// 调用zhuangXiang方法,传入的是Integer包装类对象
Integer a = new Integer(23);
// 传入的时候自动转成了所要求的int数据类型
int b = zhuangXiang(a);
/*
* 拆箱
*/
// 调用chaiXiang方法,传入的是int数据类型
int c = 23;
// 传入的时候自动转成了所要求的Integer包装类的对象
Integer d = chaiXiang(c);
编译器在直接赋值、做运算、方法调用传参上的时候能自动装箱和拆箱。
自动装拆箱的原理:
所以,自动装箱有一个弊端:
每次自动装箱时都会隐式地创建对象,比如在一个循环体中,用包装类对象去做运算,会创建很多无用的中间对象,会降低程序的性能以及加重了垃圾回收的工作量。因此在我们编程时,需要注意到这一点,正确地声明变量类型,避免因为自动装箱引起的性能问题。
调用包装类中的parseXxx方法
方法:
//xxx指的是基本数据类型,char除外
public static xxx parseXxx(String s);
特点:
// String ----> int
int a = Integer.parseInt("23");
System.out.println(a); // 23
// String ----> double
double b = Double.parseDouble("23");
System.out.println(b); // 23.0
// String ----> boolean
boolean c = Boolean.parseBoolean("传true才是true!");
System.out.println(c); // false
方法1:基本数据类型直接与 “ ” 相连接即可,如23+“KingJames”。
方法2:调用String的valueOf方法
方法3:调用包装类中的toString方法
特点:
String a = Integer.toString(23);
System.out.println(a); // 23
// double ----> String
String b = Double.toString(23.0);
System.out.println(b); // 23.0
// boolean ----> String
String c = Boolean.toString(true);
System.out.println(c); // true
方法1:包装类构造方法
方法2:静态的valueOf方法
方法:
特点:
// 以Integer为例,创建实例对象。
Integer a1 = new Integer(23);
Integer a2 = new Integer("23");
Integer a3 = Integer.valueOf(23);
Integer a4 = Integer.valueOf("23");
调用包装类的xxxValue()方法
方法:
// xxx指的八大基本数据类型
public xxx xxxValue();
特点:
// Integer ----> int
Integer a1 = Integer.valueOf(23);
int a2 = a1.intValue();
// Double ----> double
Double b1 = Double.valueOf(23.0);
double b2 = b1.doubleValue();
// Boolean ----> boolean
Boolean c1 = Boolean.valueOf(true);
boolean c2 = c1.booleanValue();