java对象的包装_Java8基础知识(一)对象包装器

对象包装器

每个基本类型都有一个对应的类,称作包装器wrapper。

/* extends Number */

// Interger int

// Long long

// Float float

// double double

// Short short

// Byte byte

/* not extends Number */

// Character character

// Void void

// Boolean boolean

对象包装器是不可变的:一旦构造了包装器,就不允许更改包装在其中的值。

对象包装器是final的:不能定义对象包装器的子类。

自动装箱(auto boxing)

声明一个Integer对象的数组列表,并添加一个值为3的Integer对象。

// 由于值包装在对象中,ArrayList的效率远低于int[]数组。

ArrayList list = new ArrayList<>();

// 等价于list.add(Integer.valueOf(3));

list.add(3);

相反地,将Integer对象赋值给int变量时,会自动拆箱。

// 编译器将以下语句翻译成int n = list.get(i).inValue();

int n = list.get(i);

在算术表达式中也能够自动地装箱和拆箱。

Integer n = 3;

// 编译器会自动地插入一条对象拆箱指令,在自增计算执行后,执行装箱指令。

n++;

包装器的比较

对象包装器的相等性与基本类型是不同的:

Integer a = 1000;

Integer b = 1000;

// ==检测a和b是否指向同一个存储区域,结果是false

System.out.println(a == b);

// equals方法比较a和b包装的值,结果是true

System.out.println(a.equals(b));

自动装箱对基本类型的值的范围有规范要求:boolean、byte、char≤127,介于-128~127之间的short和int被包装在固定的对象中,即指向相同的存储区域。

Integer a = 100;

Integer b = 100;

// 此时a和b指向同一个存储区域,结果是true

System.out.println(a == b);

引用null异常

包装器引用null时,自动装箱可能会抛出NullPointerException异常:

Integer n = null;

// 由于n引用null,执行2 * n时会将n自动拆箱取值,抛出NullPointerException异常。

System.out.println(2 * n);

自动升级

再一个条件表达式中混合使用Integer和Double时,Integer值会拆箱提升为double,再装箱为Double:

Integer n = 1;

Double x = 2.0;

// n升级为Double,结果是1.0

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值