Java装箱与拆箱

Java装箱与拆箱

@Mackyhuang

首先需要认识的是primitive type和Object

  • primitive type : int long double
  • object : Integer Long Double

装箱

        //隐式装箱
        Integer i = 6;
  • 这就是装箱的操作,把一个6装进一个Integer的箱子里面,然后把i指向了这个箱子。
        //显式装箱
        Integer i = new Integer(6);
  • 创建对象的方法把6通过构造方法装入Integer对象i

拆箱

    int unbox = i.intValue();

用一段代码看看把!

调试代码:
    public static void main(String[] args) {
        boolean res1 = new Integer(6) == 6;
            boolean res2 = new Integer(6) == new Integer(6);
            boolean res3 = Integer.valueOf(6) == Integer.valueOf(6);
            boolean res4 = Integer.valueOf(6).intValue() == 6;
            boolean res5 = new Integer(6).equals(new Integer(6));

            System.out.println(res1);
            System.out.println(res2);
            System.out.println(res3);
            System.out.println(res4);
            System.out.println(res5);
        }
答案:
        true
        false
        true
        true
        true
  • new Integer(6) == 6;
    • 这个答案是Ture, 因为java有自动拆箱装箱的机制,在这里比较的时候,会自动的把Integer对象的value拿出来,其实就是俩个primitive type的int 作比较,相当于2 == 2;
  • new Integer(6) == new Integer(6);
    • 这个答案是false, 显而易见,俩个对象进行比较,就算数值相同,也只是对象内部数据的值, 并不代表对象相同,==运算符比较的就是对象是否是不是一个
  • Integer.valueOf(6) == Integer.valueOf(6);
    • 这个答案是ture, 这里涉及到了valueOf的源码:
            public static Integer valueOf(int i) {
                if (i >= IntegerCache.low && i <= IntegerCache.high)
                    return IntegerCache.cache[i + (-IntegerCache.low)];
                return new Integer(i);
            }
+ 注意到,这里有一个low和high的概念,也就是说,如果在这个范围内,那么其实是在一个缓冲中拿到对象,反之就是重新new一个对象来返回。看看这个low和high的值
            static final int low = -128;
            static final int high;
+ 说到这里就很明白啦,如果value在这个范围内的话,其实通过valueOf获得的对象是从缓冲中拿到的同一个对象,所以这一题是True,可以尝试自己修改6为10000来查看这时候的这题的答案会是啥
  • Integer.valueOf(6).intValue() == 6;
    • 这个答案是True, 这道题逻辑清晰,把6装箱进入一个Integet,然后调用intValue()函数,
            public int intValue() {
                return value;
            }
+ 通过函数返回对象中存储int值的value
  • new Integer(6).equals(new Integer(6));
    • 这题的答案是True, 这里其实直接就是常用的对象比较,利用函数equals进行自定义比较,这里的话,Integer对象已经有了equals函数
            public boolean equals(Object obj) {
                if (obj instanceof Integer) {
                    return value == ((Integer)obj).intValue();
                }
                return false;
            }
+ 先比较对象类型,然后比较value的值,一目了然。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值