概述
Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而在实际使用时将存在很多的不便,很多地方都需要使用对象而不是基本数据类型。
比如,在集合类中,我们是无法将int 、double等类型放进去的,因为集合的容器要求元素是Object类型。而包装类型的存在使得向集合中传入数值成为可能,包装类的存在弥补了基本数据类型的不足。
此外,包装类还为基本类型添加了属性和方法,丰富了基本类型的操作。如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
基本类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱与拆箱
基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:
装箱:从基本类型转换为对应的包装类对象。
拆箱:从包装类对象转换为对应的基本类型。
用Integer与 int为例:
基本数值—->包装对象
Integer i = new Integer(4);//使用构造函数函数
Integer i1 = Integer.valueOf(4);//使用包装类中的valueOf方法
包装对象—->基本数值
int num = i.intValue();//i是之前创建的Integer对象
自动装箱与自动拆箱
从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。
Integer i = 4; //自动装箱。相当于Integer i = Integer.valueOf(4);
i = i + 5; //等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
//加法运算完成后,再次装箱,把基本数值转成对象。
实现代码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) //判断参数范围
return IntegerCache.cache[i + (-IntegerCache.low)]; //如果参数在范围内,返回一个在数组中的对应的Integer对象(cache是一个Integer数组,存储着值为-128~127的Integer对象)
return new Integer(i); //不在范围内则对用构造方法新建并返回Integer对象
}
源代码及其注释:
IntegerCache.cache[]数组源代码:
其他包装类缓存范围
类型 | 相同对象范围 |
---|---|
Integer | [-128,127] |
Short | [-128,127] |
Character | c<=127 |
Long | [-128,127] |
Double、Float的valueOf方法的实现,每次都返回不同的对象。
- 比较两个包装类型数值大小要使用equals方法
- 拆箱操作时一定要特别注意封装类对象是否为null,拆箱调用了intValue()方法,
若对象为空
,即null.intValue,运行时会抛出空指针异常
。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1401362462@qq.com