自动装箱和拆箱
1.包装类的介绍
虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类
型的数据不具备“对象”的特性——不携带属性、没有方法可调用。 沿用它们只是为了迎合人类根深蒂固
的习惯,并的确能简单、有效地进行常规数据处理。
这种借助于非面向对象技术的做法有时也会带来不便,比如引用类型数据均继承了 Object 类的特性,要
转换为 String 类型(经常有这种需要)时只要简单调用 Object 类中定义的toString()即可,而基本数据
类型转换为 String 类型则要麻烦得多。为解决此类问题 ,Java为每种基本数据类型分别设计了对应的
类,称之为包装类(Wrapper Classes),也有教材称为外覆类或数据类型类。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
基本类型和对应的包装类可以相互装换:
由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象;
包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。
jdk1.5之前,只有手动装箱与拆箱
Integer obj = new Integer(m); // 手动装箱
int n = obj.intValue(); // 手动拆箱
jdk1.5之后,才有的自动装箱与拆箱
Integer i =Integer.valueOf(100) ;
System.out.println(i) ;//输出100
int j = i.intValue () ;
System.out.println(j) ;//输出100
Integer i = 100;
相当于编译器自动为您作以下的语法编译:
Integer i = new Integer(100);
包装类数据缓存
1.Java对部分经常使用的数据采用缓存技术,即第一次使用该数据则创建该数据对象并对其进行缓存,当再次使用等值对象时直接从缓存中获取,从而提高了程序执行性能。
Integer i =12;
Integer j =12;
System. out. println(i==j);//输出true
注:Java中的=有两种作用:如果是基本数据类型则用于判断其值是否相等;如果为引用类型则用于判断两者的地址是否相同。此处i和j均为引用类型,但因为-128<12<127,创建第二个Integer j =12;的时候,直接从缓存获取,所以i和j引用的是同一块地址,所以使用=判断时其结果为true。
2.Java中只是对部分基本数据类型对应包装类的部分数据进行了缓存:
⑴byte、short、int和long所对应包装类的数据缓存范围为 -128~127(包括-128和127);
如 integer的源码所示
public static Integer valueOf(int i) {
final int offset = 128 ;
if (i >= - 128 && i <= 127 ) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
⑵float和double所对应的包装类没有数据缓存范围;
⑶char所对应包装类的数据缓存范围为 0~127(包括0和127);
⑷boolean所对应包装类的数据缓存为true和false;
包装类中equals方法
基本数据类型包装类中的equals方法用于比对相同包装类中的值是否相等,如果两者比较的包装类类型不同则返回false;
char类型除外,character比的是地址
包装类中parseXXX方法
基本数据类型包装类中的parseXXX(String s)方法用于将字符串类型数据转换为相应的基本数据类型;
注意:char类型包装类Character没有相应的parseXXX方法。