Java--自动装箱与拆箱

对象包装器是不可变的,即一旦构造了包装器类,就不允许更改包装在其中的值。同时,对象包装器类还是 final,因此不能定义他们的子类。

假设想定义一个整型数组列表。而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成 ArrayList<int>。这里就用到了 Integer 对象包装器类。我们可以声明一个 Integer 对象的数组列表。

      ArrayList<Integer> list = new ArrayList<>();

由于每个值分别包装在对象中,所以 ArrList<Integer> 的效率远远低于 int[] 数组。因此,应该用它构造小型集合,其原因是此时程序员操作的方便性比执行效率更加重要。

在很多情况下,容易有一种假象,即基本类型与他们的对象包装器是一样的,只是他们的相等性不同。大家知道,== 运算符也可以应用于对象包装器对象,只不过检测的是对象是否指向同一个存储区域,因此,下面的比较通常不会成立:

      Integer a = 1000;

      Integer b = 1000;

      if(a == b) ...

然而,Java 实现却有可能让它成立。如果将经常出现的值包装到同一个对象中,这种比较就有可能成立。这种不确定的结果并不是我们所希望的。解决这个问题的办法是在两个包装器对象比较时调用 equals 方法。

自动装箱规范要求 boolean、byte、char <= 127,介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中。例如,如果在前面的例子中将 a 和 b 初始化为 100,对他们进行比较的结果一定成立。

装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

posted @ 2017-04-27 10:08  MicroCat  阅读(171)  评论(0编辑  收藏  举报