对象包装器和自动装箱

有时,需要将int这样的基本数据类型转换为对象。所有的基本类型都有一个与之对应的类。

 

* 基本类型           包装类 (引用类型,包装类都位于java.Lang包下)

* byte                   Byte

* short                  Short

* long                   Long

* int                      Integer 【特殊】

* float                   Float

* double               Double

* char                   Character 【特殊】

* boolean             Boolean

 

Integer类对应基本类型int。这些类被称为包装器。对象包装器是不可变的,一旦构造了包装器,就不允许更改包装在其中的值。同时包装器类还是final,因此不能定义它们的子类。

 

如:定义一个整型数组列表,尖括号里不能是基本数据类型,这里就用到 Integer 对象包装器类,我们可以声明一个 Integer 对象的数组列表。

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

【注意】由于每个值分别包装在对象中,所以 ArrayList<Integer> 的效率远远低于数组。

因此,应该用它构造小型集合,其原因是此时程序员操作的方便性要比执行效率更重要。

 

好的一点是:有一个很有用的特性,从二更加便于添加 int 类型的元素到 ArrayList<Integer> 中,

list.add(3);

将自动变换成:

list.add(Integer.valueOf(3));

这种变换称为自动装箱(autoboxing)。

 

同样的,将一个 Integer 对象赋给一个 int 值时,将会自动拆箱:

将 int n = list.get(i);

翻译成: int n = list.get(i).intValue();

 

大多数情况下,容易有一种假象,即基本类型与它们的对象包装器是一样的,只有它们的相等性不同。==运算符也可以应用于对象包装器对象,只不过检测的对象是否指向同一个存储区域,

Integer a=1000;

Integer b = 1000;

if(a==b){

 

}

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

 

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

 

如果在一个条件表达式中混用Integer和Double类型,Integer值就会拆箱,提升为double,再装箱为Double:

Integer m = 1;

Double x = 2.0;

System.out.println(true ? m : x);

 

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

 

使用数值对象包装器还有一个好处:可以将一些基本方法放在包装器里。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值