Integer i5 = 128;Integer i6 = 128;i5 == i6为什么为false?

public class MyTest2 {
    public static void main(String[] args) {
        /*Integer 类中一个静态内部类 IntegerCache 他有几个静态常量

        static final int low = -128;
        static final int high;
        static final Integer cache[]; //维护的Integer数组


        他有一个静态代码,在静态代码块里面,就会 cache[] 数组赋值

static {
            // high value may be configured by property
            int h = 127;
            high = h;
            //定义了数组长度是 256
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
            assert IntegerCache.high >= 127;
        }


 Integer i5 = 128; 自动装箱 调用的 valueOf()

   /*  public static Integer valueOf(int i) { //127
        if (i >= -128 && i <= 127) {
            return Integer.IntegerCache.cache[255];
        }
        return new Integer(i);
    }

*/

        Integer i3 = new Integer(128); //new Integer(i);
        Integer i4 = new Integer(128); //new Integer(i);
        System.out.println(i3 == i4); //false
        System.out.println(i3.equals(i4)); //true
        System.out.println("-----------");

        Integer i5 = 128;
        Integer i6 = 128;
        System.out.println(i5 == i6); //false
        System.out.println(i5.equals(i6)); //true
        System.out.println("-----------");


        Integer i7 = 127;
        Integer i8 = 127;
        System.out.println(i7 == i8); //true
        System.out.println(i7.equals(i8)); //true
    }

  /*  public static Integer valueOf(int i) { //127
        if (i >= -128 && i <= 127) {
            return Integer.IntegerCache.cache[255];
        }
        return new Integer(i);
    }*/
}

Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6); //false

  1. 128为整数,而要的是一个Integer的类型,要进行自动装箱
  2. Integer类中,自动装箱的底层要调用静态的valueOf()方法
  3. 在静态的valueOf方法中有一个判断,判断输入的整数是否超过int的范围(-127~128)
  4. 超过范围会创建一个新的Integer对象,并返回,所以当比较的整数超过范围时,返回的是新创建的对象,即 Integer i5 = 128; i5接收的是一个新对象, Integer i6 = 128;i6接收的也是一个新对象,而==在引用类型中比较的是两个对象的地址是否相等,则可得出i5==i6的比较结果为false
  5. 若输入的整数没有超过范围,则返回(Integer类中的)静态方法IntegerCache()中的存在于静态代码块中的Integer类型的静态数组cache中的某个值。因为是静态方法而且静态数组cache在静态代码块中,所以在类加载的时候就执行。在静态代码块中,对cache数组进行赋值操作。
    也就是说当输入的整数在范围内时会调用一个数组,而且数组的下标是输入的值+1计算出来的,而数组中的值,是在类加载的时候就已经存放好的。
以下是具体源代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

由以下可知,只有数值型中会出现这种情况

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值