包装类
为什么要用包装类?
1.某些方法的参数必须是对象,为了让基本数据类型的数据能作为参数,提供了包装类
2.包装类提供了很多功能,如:获取基本类型范围的最大值,字节数的方法
3.可以实现字符串和基本数据类型间的转换
代码示例:
public class Demo01 {
public static void main(String[] args) {
String a="10";
int i = Integer.parseInt(a);//将字符串转换为基本数据类型中的int类型
Integer integer = Integer.valueOf(a);//将字符串转换为Integer包装类
double v= Double.parseDouble(a);//将字符串转换为基本数据类型中的double类型
Double aDouble = Double.valueOf(a);//将字符串转换为Double包装类
System.out.println("i="+i);
System.out.println("Integer="+integer);
System.out.println("v="+v);
System.out.println("Double="+aDouble);
}
}
运行结果:
i=10
Integer=10
v=10.0
Double=10.0
自动装箱、拆箱
public class Demo02 {
public static void main(String[] args) {
int i = 10;
Integer ii = new Integer(i);//手动将基本数据类型转换为包装类
int c = ii.intValue();//手动将包装类转换为基本数据类型
//jdk1.5以后:自动装箱(基本数据类型-->包装类)
Integer a=i;//底层使用Integer.valueOf()完成自动装箱,Integer.valueOf()其实也是通过new Integer()实现的
//jdk1.5以后:自动拆箱(包装类-->基本数据类型)
int b=a;//底层使用intValue()完成自动拆箱
}
}
注意
1.jdk1.5之后,增加了自动装箱,自动拆箱功能
2.自动装箱时调用的valueOf()方法,valueOf()底层其实调的还是new Integer()方法
3.自动拆箱调的xxxVaule()方法
4.包装类在自动装箱时为了提高效率,对于-128~127之间的值进行了缓存处理。超过范围后,对象之间不能在使用==进行数值的比较,而是使用equals方法
valueOf源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);//超出-128~127范围的会创建对象
}
代码示例
public class Demo03 {
public static void main(String[] args) {
int a=10;
Integer b=10;
//==比较的地址,equals比较的值
System.out.println(a==b);// true + - * / == 类型不一样时,会自动拆箱
System.out.println(b.equals(a));//true
Integer aa=new Integer(10);
Integer bb=new Integer(10);
System.out.println(aa==bb);//false,地址不同
System.out.println(aa.equals(bb));//true
Integer aaa=125;
Integer bbb=125;
System.out.println(aaa==bbb);//true,缓存中取
System.out.println(aaa.equals(bbb));//true
Integer aaaa=130;
Integer bbbb=130;
System.out.println(aaaa==bbbb);//false,地址不同
System.out.println(aaaa.equals(bbbb));//true
}
}