Java 装箱拆箱

什么是装箱拆箱

Java中基本数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是装箱和拆箱,装箱和拆箱可以让我们的代码更简洁易懂。

Java中基础数据类型与它们对应的包装类见下表(共8种):

原始类型包装类型字节数
booleanBoolean没有精确定义
byteByte1 Byte
charCharacter2 Byte
floatFloat4 Byte
intInteger4 Byte
longLong8 Byte
shortShort2 Byte
doubleDouble8 Byte

当表格中左边列出的基本类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或拆箱。

  • 进行 = 赋值操作(装箱或拆箱)
  • 进行+,-,*,/混合运算 (拆箱)
  • 进行>,<,==比较运算(拆箱)
  • 调用equals进行比较(装箱)
  • ArrayList,HashMap等集合类 添加基础类型数据时(装箱)

自动装箱,拆箱的代码实现

以 int 和 Integer 为例,装箱就是调用 Integer 的 valueOf 方法从缓存中获取一个 Integer 对象 或 new 一个 Integer,拆箱就是调用 Integer 对象的 intValue 方法并赋值返回给 int 。其他基础类型都是大同小异的,具体可以查看源码。

Integer 装箱拆箱
<!--Integer 成员变量-->
private final int value;
<!--装箱-->
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
<!--拆箱-->
public int intValue() {
    return value;
}
Short 装箱拆箱
<!--Short 成员变量-->
private final short value;
<!--装箱-->
public static Short valueOf(short s) {
    final int offset = 128;
    int sAsInt = s;
    if (sAsInt >= -128 && sAsInt <= 127) { // must cache
        return ShortCache.cache[sAsInt + offset];
    }
    return new Short(s);
}
<!--拆箱-->
public short shortValue() {
    return value;
}
Float 装箱拆箱
<!--Float 成员变量-->
private final float value;
<!--装箱-->
public static Float valueOf(float f) {
    return new Float(f);
}
<!--拆箱-->
public float floatValue() {
    return value;
}

结论

以上 Integer 和 Short 的装箱操作都是先从缓存中判断这个值是否在[-128,127]区间,如果在这个区间,直接从缓存中获取,否则 new 一个。通过观察其他包装类型装箱拆箱的源码,并不是所有包装类型都有缓存的机制。

<!--存在缓存机制的包装类型-->
Boolean/Byte/Short/Integer/Long/Character

<!--不存在缓存机制的包装类型-->
Float/Double

注意 Boolean 定义了两个静态常量当做缓存。

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

可见除了单精度浮点型(Float)和双精度浮点型(Double)没有缓存。其他包装类型都有缓存机制。这是为什么呢?很简单,对于浮点数,100.1与100.2之间有多少个浮点数呢?答案是无数个!所以这里无法像其他包装类型那样做缓存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值