一、引入
- 目的:让 Object统一管理所有类型的数据。
- 包装类:基本数据类型对应的 对象类型的类 被称为基本数据类型的包装类。
二、基本 数据类型 对应包装类型
- 包装类都是位于 java.lang中,无需导入包,包装类都被final修饰,没有子类。
- 对应关系如下:
基本数据类型 包装类类名
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
三、数据类型之间的转换(以Integer为例)
- int 和 Integer 之间的转换
(1) int —> Integer [关注]
int a = 12;
a. Integer i1 = new Integer(a);//利用构造方法
System.out.println(i1);//12:Integer类中覆盖类toString
b. Integer i2 = Integer.valueOf(a);//Integer类中静态方法
(2) Integer -> int
int n = i2.intValue();//Integer类中成员方法
- String 和 Integer之间的转换
(1) String -> Integer
a.Integer i3 = new Integer("123");//利用构造方法
b.Integer i4 =
Integer.valueOf("123");//Integer类静态方法
(2) Integer -> String
a.String s1 = i4.toString();
b.String s2 = i4+""; //利用字符串拼接
- int 和 String 之间的转换
(1) int --> String
int a2 = 32;
String s3 =a2+"";//利用字符串的拼接
(2) String --> int
String a = 18;
int age = Integer.parseInt(a);//Integer类中静态方法
注意:String转换为 Integer/int时,要求 String中数据必须是纯数值类型,并且不能超过 Integer类型的数据范围,否则编译通过,但是运行报错,错误信息如下:
java.lang.NumberFormatException(数值格式转换异常)
四、自动的装箱 和 拆箱
- JDK5.0版本提供了自动装箱 和 拆箱功能,即:基本数据类型和对应的包装类型之间可以相互转换。
- 装箱和拆箱
(1) 装箱:将基本数据类型转换为 对应的包装类型
Integer i1 = 12;// int ----> Integer
(2) 拆箱:包装类型 转换为 对应的基本数据类型
Integer i1 = 12;
int a = i1; // Integer ---> int
- 自动装箱的原理分析
(1) 自动装箱 时,jvm默认调用 Integer类中的静态方法valueOf(int n),实现对应 int --> Integer之间的转换
(2) valueOf方法实现的细节:
public static Integer valueOf(int i) {
if (i >= -128 && i <= 127){
// 如果 i 在 -128~127之间 ,返回 一个结果?????
return IntegerCache.cache[i + (-IntegerCache.low)];
}
// 如果 i 不在 -128~127之间
return new Integer(i);
}
/*
valueOf方法实现的解释:如果传递的要转换的value数据不在 -128~127之间,则通过 new Integer(value);方式完成转换;但是如果 value 在 -128~127之间的数据,获取的结果来源如下:
*/
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
int h = 127;
high = h;
cache = new Integer[(high - low) +1];
int j = low;
for(int k = 0; k < cache.length;k++){
cache[k] = new Integer(j++);
}
}
}
(3) 缓冲区的作用:Integer对常用数据段 -128~127进行了预先包装处理,包装的结果存储在 常量池(也称为缓冲区),为了提高 包装的效率,从而也提高jvm内存的空间利用率。
(4) 面试题目:分析以下程序打印输出的结果;
五、包装类的实际开发应用
- 应用场景:类中属性由 之前的基本数据类型,替换为 对应包装类型
- 应用场景的目的:是为了区分有效数据和无效数据的,例
如:0和null;
0.0 和 null 等。