Integer的封装原理及200封装为Integer时比较为不相等的原因

文章讲述了Integer类的底层装箱原理,通过MyIntegerCache缓存-128到127之间的Integer对象,当值超出该范围时,会创建新的Integer对象。例如,100会被缓存,而200不会,导致比较时结果不同。
摘要由CSDN通过智能技术生成


前言

Integer的底层封装原理简单解析。


一、题目

  		Integer integer1 = Integer.valueOf(100);
        Integer integer2 = Integer.valueOf(100);
        System.out.println(integer1==integer2);

        Integer integer3 = Integer.valueOf(200);
        Integer integer4 = Integer.valueOf(200);
        System.out.println(integer3==integer4);

结果:
在这里插入图片描述

二、原因

1.Integer底层手动装箱原理

代码如下:
在这里插入图片描述
书写MyInteger类

//    缓存类
    private static class MyIntegerCache{
        private static final int low = -128;
        private static final int high = 127;
        private static final MyInteger[] cache;
        static {
            cache = new MyInteger[high-low+1];//256
            int j = low;
            for (int i = 0; i < cache.length; i++) {
                cache[i]=new MyInteger(j++);
            }
        }
    }

//    装箱
    public static MyInteger valueOf(int i){
        if (i>=MyIntegerCache.low && i<MyIntegerCache.high){
            return MyIntegerCache.cache[i-MyIntegerCache.low];
        }
        return new MyInteger(i);
    }

在Integer中存在一个缓存类,其中cache存有-128至127的Integer对象,当调用装箱valueOf方法时,将判断数据是否在-128至127之间,若存在,则调用缓存类中cache数组中的对象;若不存在,则重新new一个新Integer对象。因100在-128至127之间,调用的对象为缓存类中的同一Integer对象;200不在其区间,故每次包装int类型的200时将新建一个Integer对象,故将其比较时结果为false。


总结

当数据在-128至127之间时,两个相同int封装为Integer类型,Integer对象是同一对象;不在这个区间时,将不是同一Integer对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值