一、什么是包装类
在Java中,基本数据类型不是对象,不能使用类的方法;因此, Java针对基本类型提供了它们对应的包装类,八大基本数据类型,对应了八种包装类,以对象的形式来调用。包装类有了类的特点,使我们可以调用包装类中的方法。
byte | Byte |
short | Short |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
int | Integer |
char | Character |
可以看到,在形式上,除了Integer和Character这两个包装类之外,其余六个包装类的类名均是对应的基本类型首字母大写后得到的。
除了Boolean类和Character类,其余六个类都是继承Number类而来。
二、装箱和拆箱
装箱:基本类型——>对象类型
拆箱:对象类型——>基本类型
2.1手动装箱与手动拆箱
在jdk5以前,只能进行手动装箱和拆箱。
int n1 = 100;
//手动装箱
Integer integer = new Integer(n1);
Integer integer1 = Integer.valueOf(n1);
//手动拆箱
int i = integer.intValue();
2.2自动装箱和自动拆箱
在jdk5以后,可以进行自动装箱和自动拆箱。
int n2 = 100;
//自动装箱
Integer integer2 = n2;//底层使用的是Integer.valueOf(n2);
//自动拆箱
int n3 = integer2;//底层使用的是intValue()
编译器,帮程序员把这些工作完成了,本质还是调用了方法,其它类也可依此类推。
三、包装类型与String类的相互转换
//包装类(Integer)->String
Integer i = 100;
String s1 = i + "";
String s2 = i.toString();
String s3 = String.valueOf(i);
//String -> 包装类
String s4 = "12345";
Integer i1 = Integer.parseInt(s1);
Integer i2 = new Integer(s2);
四、Integer创建机制
在Java中,自动装箱的在底层调用了Integer.valueOf()方法。我们来看看它的源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) //-128<= i <=127
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在Integer中,采用缓存机制来提高性能,默认情况下,如果传入的i在[-128,127]之间,就会直接从IntegerCache.cache数组中返回一个已经缓存的对象。如果不在这个范围内那么方法会创建一个新的Integer对象。