整型包装类(Byte、Short、Integer、Long)的使用与解析

目录

一、使用

二、实现机制


一、使用

使用这几个类时要注意如下两点:

1、类型转换

原则:宽化类型转换(即小范围类型向大范围类型的转换),可自动转换;窄化类型转换(大范围类型向大范围类型的转换),需强制转换。

实例:Short n = 127; n = n + 1; 在编译时不会通过,因为byte、short、char等类型相加时都是用iadd指令,即将操作数当成int型处理,计算的结果是int型,将int型的结果赋值给Short型的变量n,虽然要进行装箱处理,但还是属于窄化类型转换,JVM不能自动转换。但Long m = 127L; m = m + 1; 却能通过编译,因为编译m + 1时,会将1当成long型处理,并用ladd指令执行加操作,计算结果是long型,再将这个结果装箱并赋值给Long类型的变量m,不存在窄化类型转换的问题。

2、对象比较

正常情况下,-128~127对应的包装类型都缓存了相应的对象,获取时都是从缓存中获取对象,所以针对同一数值多次获取到的是同一实例,比较的结果也就相等了。

如:Short s1 = 100; Short s2 = 100; println(s1 == s2); 输出的结果是true,因为s1和s2中存放的是同一个Short类型的实例。

二、实现机制

将一个数值赋值给Byte、Short、Integer、Long等类型的变量时,会用对应类的静态成员方法valueOf进行处理(不建议用这些类的构造方法进行实例),核心valueOf方法的源代码如下(下面以Short类的源代码为例):

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);

}

从上面的代码可以看出,当数值等于-128、127或之间的值时,将从cache中获取实例,因此,当值介于-129~128之间时,总是从cache中获取实例,得到的是总是同一实例。cache的源代码如下:

private static class ShortCache {
        private ShortCache() {}

        static final Short[] cache;
        static Short[] archivedCache;

        static {
            int size = -(-128) + 127 + 1;

            // Load and use the archived cache if it exists
            CDS.initializeFromArchive(ShortCache.class);
            if (archivedCache == null || archivedCache.length != size) {
                Short[] c = new Short[size];
                short value = -128;
                for(int i = 0; i < size; i++) {
                    c[i] = new Short(value++);
                }
                archivedCache = c;
            }
            cache = archivedCache;
        }
}

即当没有缓存时,新建一个Short类型的有256个元素的数组,并依次存放-129~128之间的整数,然后将其缓存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值