在某些场合不能使用基本类型必须使用包装类,比如集合能接收的类型为Object,基本类型是无法添加进去的,还有范型也必须使用包装类。
另外假设我们要定义一个变量表示分数 如果用基本类型表示的话:int score;
默认值为零,如果我想表示分数为空也就是没有参加考试就没法表现了因为值类型是无法赋空值的,如果使用包装类型 Integer score ,就可以表示这种情况,因为 Integer 的默认值为空。
包装类型是引用类型,说白了就是一个类,既然是类,里面可以有属性和方法,它里面有哪些属性和方法呢?每个包装类型和基本数据类型都是大同小异的,我们拿 Integer 和 int来举例说明:
假设有这样一个场景,我接收到一个String型的数据想把它转换为整型,如果没有包装类这个操作是无法完成的,有了包装类我们可以这样做:
String num1 = "123";
int num2 = Integer.parseInt(num1);
parseInt就是Integer包装类提供的一个将字符串转成int型的方法。
包装类还有一个很重要的特新就是数据缓存:
还是拿Integer来举例,在-128127区间的数会被缓存,当类加载的时候就创建这256个数对应的对象,并放到名为cache的数组中,调用valueOf()方法时会先判断该数是否在-128127的区间,如果在则直接获取数组中该对象的引用,如果不在则创建该对象。valueOf()方法的源码如下:
pblic static Integer valueOf(int i) {
if (i >= IntegerCache.low* && i <= IntegerCache.high*)
return IntegerCache.cache*[i + (-IntegerCache.low*)];
return new Integer(i);
}
这里IntegerCache.low为-128,IntegeCache.high为127,IntegerCache.cache为数组存储的就是-128到127的Integer对象。
在自动装箱的时候调用的就是valueOf方法。
我们来看下面这段代码:
public static void main(String[] args) {
Integer num1 = 4;
Integer num2 = 4;
System.out.println(num1==num2);
System.out.println(num1.equals(num2));
Integer num3 = 145;
Integer num4 = 145;
System.out.println(num3==num4);
System.out.println(num3.equals(num4));
}