包装类的自动拆装箱与自动装箱

在Java中,包装类(如Integer、Double、Boolean等)是基本数据类型(如int、double、boolean等)的对应类。这些类提供了许多有用的方法来操作这些基本数据类型,并且允许你在需要对象的地方(例如在集合中)使用基本数据类型。

Java 5引入了自动装箱(autoboxing)和自动拆箱(autounboxing)的功能,这两个功能大大简化了基本数据类型与包装类之间的转换。

自动装箱(Autoboxing)

自动装箱是Java编译器在基本数据类型和对应的包装类之间自动进行转换的简化写法。当你将一个基本数据类型的值赋给一个包装类对象时,编译器会自动将基本数据类型值包装成对应的包装类对象。

示例:

Integer i = 10; // 自动装箱,等同于 Integer i = Integer.valueOf(10);

自动拆箱(Autounboxing)

自动拆箱与自动装箱相反,它是Java编译器在需要基本数据类型值的时候自动将包装类对象转换成基本数据类型。这通常在包装类对象与基本数据类型进行算术运算或比较时发生。

示例:

Integer i = 10;  
int j = i; // 自动拆箱,等同于 int j = i.intValue();  
  
if (i == 10) { // 这里也发生了自动拆箱,等同于 if (i.intValue() == 10)  
    System.out.println("i is 10");  
}

注意点

  • 由于自动拆箱涉及到对象到基本数据类型的转换,如果包装类对象是null,那么在自动拆箱时会抛出NullPointerException。
  • 在进行数值比较时,如果比较的是两个包装类对象,那么会使用它们的equals()方法进行比较,而不是==。因为==在比较对象时比较的是它们的引用是否相同,而不是值是否相等。但在自动拆箱的情况下,==会先将包装类对象拆箱成基本数据类型,然后进行比较。

示例:

Integer a = 127;  
Integer b = 127;  
System.out.println(a == b); // 输出 true,Integer 类型的值在 -128 到 127(包括 -128 和 127)
之间的原因是因为这个范围内的整数会被自动装箱和拆箱时缓存。
这个特性是由 Java 的自动装箱和拆箱机制提供的,旨在提高性能。
Integer c = 128;  
Integer d = 128;  
System.out.println(c == d); // 输出 false,因为c和d指向的是两个不同的Integer对象  
  
Integer e = null;  
int f = e; // 这会抛出 NullPointerException

在上面的示例中,对于-128到127之间的Integer值,Java会进行缓存,所以a和b实际上引用的是同一个对象,因此a == b的结果是true。但对于其他值,每次调用Integer.valueOf()或进行自动装箱时都会创建一个新的对象,所以c和d引用的是两个不同的对象,c == d的结果是false。而尝试将一个null的Integer对象进行自动拆箱时,会抛出NullPointerException。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值