包装类基本知识
将基本数据类型存储到Object[]数组或集合中的操作
包装类均位于java.lang包
“数字型”都是java.lang.Number的子类。Number类是抽象类,因此它的抽象方法,所有子类都需要提供实现。Number类提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味着所有的“数字型”包装类都可以互相转型。
包装类的用途
对于包装类来说,这些类的用途主要包含两种:
1. 作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如Object[]、集合等的操作。
2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本数据类型、包装类对象、字符串之间提供相互之间的转化!)。
包装类的使用
package cn.dym09;
public class Test09 {
void testInteger() {
Integer int1=new Integer(10);
Integer int2=Integer.valueOf(20); //官方推荐这种说法
// Integer对象转化成int
int a=int1.intValue();
//字符串转化成Integer对象
Integer int3=Integer.parseInt("334");
Integer int4=new Integer("999");
//Integer对象转化成字符串
String str1=int3.toString();
//一些常见int类型相关的常量
System.out.println("int能表示的最大整数:"+Integer.MAX_VALUE);
}
public static void main(String [] args) {
Test09 test=new Test09();
test.testInteger();
}
}
自动装箱和拆箱
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。
自动装箱:基本类型的数据处于需要对象的环境中时,会自动转为“对象”。
原因:以Integer为例:在JDK1.5以前,这样的代码 Integer i = 5 是错误的,必须要通过Integer i = new Integer(5) 这样的语句来实现基本数据类型转换成包装类的过程;而在JDK1.5以后,Java提供了自动装箱的功能,因此只需Integer i = 5这样的语句就能实现基本数据类型转换成包装类,这是因为JVM为我们执行了Integer i = Integer.valueOf(5)这样的操作,这就是Java的自动装箱。
自动拆箱:每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用intValue()、doubleValue()等转型方法。
如 Integer i = 5;int j = i; 这样的过程就是自动拆箱。
总结:自动装箱过程是通过调用包装类的valueOf()方法实现的,而自动拆箱过程是通过调用包装类的 xxxValue()方法实现的(xxx代表对应的基本数据类型,如intValue()、doubleValue()等
package cn.dym10;
public class cl01 {
public static void main(String [] args) {
Integer b=23; //自动装箱
int a=new Integer(20); //自动拆箱
//下面的问题需要注意:
Integer c=null;
int d=c; //此处其实就是:c.intValue(),因此抛空指针异常
}
}
包装类的缓存问题
整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率
缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时(或者手动调用valueOf()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。
1. IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用。
2. 一般情况下 IntegerCache.low为-128,IntegerCache.high为127,IntegerCache.cache为内部类的一个静态属性
package cn.dym10;
public class test01 {
public static void main(String [] args) {
Integer in1=-128;
Integer in2=-128;
System.out.println(in1==in2); //true 在缓存范围内
System.out.println(in1.equals(in2)); //true
Integer in3=1234;
Integer in4=1234;
System.out.println(in3==in4); //false 不在缓存范围内
System.out.println(in3.equals(in4)); //true
}
}
包装类在自动装箱时为了提高效率,对于-128~127之间的值会进行缓存处理。超过范围后,对象之间不能再使用==进行数值的比较,而是使用equals方法。