包装类
八种常用类之包装类
1.包装类
1.1 什么是包装类?有什么用?
Java为8大基本数据类型都分别提供了一个包装类。
1.1.1 用于将基本数据转化为对象,便于操作。
int aa = 10 ;//基本类型的赋值
Integer bb = new Integer(10);//包装类的赋值
区别在于基本类型的赋值将数据存于栈内;包装类的赋值是将对象的地址赋值给bb,而真正的数据存储与该地址指向的堆内存内。
1.1.2 将字符串转换为其他类型的数据
String类型的值是不能直接强制转换为int类型的,当使用包装类时,由包装类调用相应的方法就能将String类型转换为int类。
String c = "name";
int i = Integer.parseInt(c);//正确的String类型转换为int类型的方式
1.2 基本类型和包装类型的相互转换
int aa = 10;
Integer bb = new Integer(aa);//基本类型转化为包装类
/******************************************************/
int cc = bb.intValue(); //包装类型转为基本类型
1.3 装箱与拆箱
上述介绍了包装类型的赋值和与基本类型之间的转化。
装箱: 基本类型 ==》包装类
拆箱: 包装类 ==》基本类型
1.3.1 自动装箱与自动拆箱
上述的转换其实过于麻烦,实际上可以有简化操作。
int a = 10;
Integer b = 10 ;//赋值
Integer c = a;//自动装箱,底层使用的是Integer.valueOf()完成的自动装箱操作
int d = b;//自动拆箱,底层使用 intValue()完成
1.3.2 基本数据与包装类型数据几种比较
①
public static void main(String[] args) {
int a = 10;
Integer b = 10;
System.out.println(a == b);//true
System.out.println(b.equals(a));//true
System.out.println("====================");
}
基本类型与包装类型比较时,由于==两边对于基础数据类型是直接比较值的,包装类型的数据在此处做了一个自动拆箱的处理,所以输出为true。
当==两边有任意一边为包装类时都会做自动拆箱处理。
②
Integer aa = new Integer(100);
Integer bb = new Integer(100);
System.out.println(aa == bb);//false
System.out.println(aa.equals(bb));//true
System.out.println("====================");
两边都是由new关键字实例化一个Integer类型,因此比较的时两边的地址,所以输出false。
③
Integer aaa = 101 ;
Integer bbb = 101;
System.out.println( aaa == bbb);//true
System.out.println(aaa.equals(bbb));//true
System.out.println("====================");
自动装箱时底层调用的是valueOf(),当范围为-128~127时可以认为是基本类型比较。
④
Integer aaaa = 250 ;
Integer bbbb = 250;
System.out.println( aaaa == bbbb );//false
该例为③例的返例,当自动装箱的数据大小超过-128~127的范围时,将由new Integer();实现装箱。
1.3.3 valueOf();
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
valueOf()源码如上,IntegerCache.low和IntegerCache.high分别为IntegerCache类中的常量,大小分别为-128,127。由此可见,自动装箱时,数据传入valueOf()会先进行一个判断,当判定数据处于-128~127内部时,将会返回提前储存在数组cache[]中的数,否则由构造器创建一个新的实例。
很明显数组cache[]中有255个数,为何要提前在数组中存储数据?很明显是为了提升性能,因为类IntegerCache中的静态代码块在类初始化时同时初始化,而该数组正处于初始化时的该堆内存内。
java初学者,如有错误或遗漏,还请指教。

浙公网安备 33010602011771号