有时候需要将int这种基本类型转换为对象类型的,所有的基本类型都有一个与之对应的类。
比如说int类型对应于Integer类,通常的情况下称这些类为包装器。这些对象包装器类的名字对应于基本类型的名字,分别是Integer,Long,Double,Short,Byte,Character,Void和Boolean(前面6个类派生于公共的超类Number),对象包装器类是不可变的,即一旦构造了包装器,既不允许更改包装在其中的值,同时,对象包装器类还是final类,不允许定义他们的子类。
如果定义一个整型的数组列表,而尖括号中的类型不允许是基本数组,也就是说不允许写成ArraysList<int>,这个时候就用的到包装类了,声明格式如下:
ArraysList<Integer> list = new ArraysList<>();
注意:
由于每个值分别包装在对象里,所以ArraysList<Integer>的效率比使用数组进行操作要低很多。因此,以上这种定义,只适用于小型集合。
如果调用List.add(3);语句,将自动转换为list.add(Integer.valueof(3));这种转变被称为自动装箱。相反,将一个Integer类型的值赋给一个int类型的变量时,将会自动拆箱。这种自动装箱和自动拆箱在运算符中也会存在。
比如:
Integer n = 3;
n++;
编译器将自动插入一条拆箱的指令,然后再进行自增运算,最后再将结果装箱。
关于自动装箱还有要注意的地方:
首先,由于装箱器引用可能为null,所以自动装箱有可能会抛出一个NullPointException异常。
另外,如果在一个条件表达式中混合使用Integer和Double类型,Integer值就会拆箱,提升为double,再装箱为Double。
最后,装箱和拆箱是编译器认可的,而不是虚拟机。编译器再生成字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。
我们还可以将基本类型放在包装器中,例如,将一个数字字符串转换为数值型。
Int x = Integer.praseInt(s); praseInt是一个静态方法。
下面是JavaAPI中关于Integer的几个方法:
int intValue()
以int的形式返回Integer对象的值,在Number类中覆盖了intValue()方法。
Static String toString(int i)
以一个新的String对象的形式返回给定数值i的十进制表示。
Static int PrasrInt(String s)
返回字符串s的整数数值,给定字符串表示的是十进制的整数
Static Integer valueOf(String s)
返回用s表示的整型数值进行初始化后的一个新Integer对象