16.对象包装器与自动装箱【Java温故系列】

参考自–《Java核心技术卷1》

对象包装器与自动装箱

1 对象包装器

有时,需要将 int 这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。例如,Integer 类对应基本类型 int。通常,这些类称为包装器。这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Void 和 Boolean(前6个类派生于公共的超类 Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器还是 final,因此不能定义它们的子类。

若要定义一个整型数组列表,而尖括号中的类型参数不允许是基本类型,就需要用到 Integer 对象包装器类。

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

:由于每个值都包装在对象中,ArrayList<Integer> 的效率远远低于 int[] 数组。因此,一般只用它构造小型集合(便于操作)。

对象包装器对象的比较

使用 “==” 比较两个对象包装器对象时,检测的是对象是否指向同一个存储区域。因此,下面的比较通常不会成立:

Integer a = 1000;
Integer b = 1000;
System.out.println(b==a);  //false

所以,对于对象包装器值的比较需要调用 equals 方法

将某些基本方法放置在包装器中

例如,将一个数字字符转换成数值。

int x = Integer.parseInt(s);  //数字字符s

parseInt 是一个静态方法,与 Integer 对象没有关系,但 integer 可以很好地放置这个方法。


2 自动装箱

有个很有用的特性,便于添加 int 类型的元素到 ArrayList<Integer> 中:

list.add(3);

将自动变换为:

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

这种变换称为自动装箱

相反的,当将一个 Integer 对象赋给 int 值时,将会自动地拆箱

int n = list.get(i);   //获取list数组列表中下标为i的元素

将被编译器翻译为:

int n = list.get(i).intValue();

甚至在算术表达式中也能自动地装箱和拆箱:将自增操作符应用于一个包装器引用

Integer n = 3;
n++;

编译器将自动地插入一条对象拆箱的指令,然后进行自增计算,最后再将结果装箱。

关于自动装箱的说明

1)包装器类引用可以为 null,所以自动装箱有可能抛出异常(null进行数值运算)

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值