基本类型与包装类
1.java中包括8个基本类型,与之对应的有8个包装类型,包装类是针对原生数据类型的包装
基本类型 包装类型 byte Byte(Number的子类) short Short(Number的子类) int Integer(Number的子类) long Long(Number的子类) float Float(Number的子类) double Double(Number的子类) character Character(Object的子类) boolean Boolean(Object的子类) 2.区别
- 基本类型是直接用来存储值的,放在栈中方便快速使用,包装类型是类,其实例是对象,放在堆中
- 基本类型不是对象,因此没有方法,包装类型是类,因此有方法
- 基本类型直接赋值即可,包装类型需要使用new关键字创建
- 包装类型初始值为null,基本类型初始值不为null,是根据类型而定的
3.为什要需要有包装类型
包装类型将基本类型的值包装在对象中,这样就可以使用对象的方法操作基本类型,类型之间的转换需要使用包装类型的方法才能完成,因此需要有包装类型。
包装类 装箱 拆箱 Byte valueOf(String s)装箱成包装类
valueOf(String,int)根据指定进制装箱成包装类
byteValue() Short valueOf() shortValue() Integer valueOf() intValue() Long valueOf() longValue() Float valueOf() floatValue() Double valueOf() doubleValue() Character valueOf() charValue() Boolean valueOf() booleanValue() 使用包装类的parseXXX方法还可以实现不同类型之间的转换,如将数字字符串转换为int类型:
int i = Integer.parseInt("23");
拆箱与装箱
装箱:将基本类型转换成包装类的过程
拆箱:将包装类转换成基本类型的过程
在jdk1.5之后提供了自动拆装箱
来个栗子
public class SimpleTest { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1==i2); //①true System.out.println(i3==i4); //②false } }
①处结果为true,②处为false,原因是什么呢?(我的jdk是1.8版本的)
Integer i1 = 100;执行的操作是100先通过valueOf()方法进行装箱操作,Integer.valueOf()的源码如下:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }Integer比较特殊,在-128到127之间,会走缓存,不在这个区间的数会走new Integer(i),也就是会创建新的对象,因此,100比较的时候是true,200比较的时候是false