拆箱与装箱,看这一篇博客就够了!

开这篇博客之前,先说下Long和long的区别
java有八大基本数据类型,byte(8),char(16),short(16),int(32),long(64),float(32),double(64),boolean(1)
对应的八种包装类型,Byte,Char,Short,Integer,Long,Float,Double,Boolean
对于包装类来说,它的用途主要有两种:
a.作为基本类型对应的类类型,方便对象操作
b.包含每种基本数据类型的最大值,最小值等操作方法

双等号针对基本数据类型比较的是值,针对引用类型比较的是对象的内存地址。equals方法在Object对象里比较的是对象的内存地址,但Long这类包装类型对其方法重写了,比较的实际是对象的值。
我们先看下什么叫装箱和拆箱
装箱其实就是把基本类型转换为包装类型,拆箱就是把包装类型转换为基本类型
例如:Integer a = 1;(自动装箱,其实就是执行了Integer a = Integer.valueOf(1))
int b = a (自动拆箱,底层其实就是执行了int b =a.intValue())
接下来重点来了,那Long i = 12L;Long j = 12L;System.out.println(i==j);//true为什么打印也是true呢?
查詢源码我们发现

 private static class LongCache {//806行i
        private LongCache(){}
        static final Long cache[] = new Long[-(-128) + 127 + 1];
        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Long(i - 128);
        }
    }
public static Long valueOf(long l) {//835行
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

在Long的值为-128到127时,都放在cache里不会重新创建对象,所以==是成立的,当不在此范围内就不成立了。不关Long类型,其余的包装类型中也有类似cache。

我们再来看一题


public class TestDemo {
    public static void main(String[] args) {
        Integer a = 2;
        Integer b = 3;
        Integer c = 4;
        Long d = 3L;
        Long e = 4L;
        int f = 2;
 
        //一旦有包装类型和数值类型判断==时,则触发包装类型的自动拆箱,转为数值类型的比较
        System.out.println(new Integer(300) == 300);//返回true
 
        //一旦有包装类型和数值类型发生运算时,则触发包装类型的自动拆箱,转为数值类型的运算
        System.out.println(c == (a + f));//返回true
 
        //一旦有包装类型和包装类型发生运算时,则触发包装类型的自动拆箱,转为数值类型的运算
        System.out.println(c == (a + b));//返回true
 
        //只有对象类型才有equals方法,因此首先a,b触发包装类型的自动拆箱,转为数值类型的运算。
        //运算完,再将结果3自动装箱,Integer重写了equals,因此可以转为包装类型与包装类型的比较。
        //当两边的包装类型不一致时,必定返回false。
        //当两边的包装类型一致时,再进行拆箱,判断两者代表的数值是否相等。
        System.out.println(c.equals(a + b));//返回true
 
        //不同数据类型的数值进行运算,首先会将低精度的数据类型转化为高精度的数据类型,即自动类型转换。
        //比如现在的int+long,会提升到long+long,再进行运算。
        System.out.println(e == (a + d));//返回true
 
        //==号两边类型不一致时,直接执行自动拆箱,比较之后的数值
        System.out.println(e == (a + b));//返回true
 
        //依次经历自动拆箱,自动类型转换、运算、自动装箱,类型比较,拆箱,数值比较
        System.out.println(e.equals(a + d));//返回true
 
        //依次经历自动拆箱,自动类型转换、运算、自动装箱,类型比较,两边类型不一致,直接返回false
        System.out.println(c.equals(a + d));//返回false
    }

现在对基本类型与包装类型的拆箱装箱理解了吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值