Java对象包装器与自动装箱

有时候需要将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对象

猜你喜欢

转载自blog.csdn.net/ibliplus/article/details/81174077