Short, Integer, Long缓存

        Integer intA = 127;
        Integer intB = 127;
        
        Integer intC = 128;
        Integer intD = 128;
        
        System.out.println(intA == intB); //true
        System.out.println(intC == intD); //false

Integer里弄了一个缓存,对于在 -128 ~ 127 之间的数值,会直接使用该缓存里的对象

也就是说 Integer intA = 127 或者 Integer intA = Integer.valueOf(127) ,最终 intA 得到的是Integer里的缓存对象 

同理,intB也是获得该相同对象因此 进行 intA == intB 比较时,intA和intB引用的是同一个对象,因此就true 

而对于128,已经超出缓存范围了,因此会生成一个新的Integer对象, intC和intD就引用不同的对象了,进行==比较,当然就false了.

 

但是如果new Integer() 则直接创建一个新的对象, 并不会到缓存中取.

        Integer i3 = new Integer(100);
        Integer i4 = new Integer(100);
        System.out.println("i3 == i4: "+(i3 == i4)); //false

Integer的cache是configurable的,  -Djava.lang.Integer.IntegerCache.high=1000可以改变cache的最大值, 最小值不能config固定为-128

        //java option中加入-Djava.lang.Integer.IntegerCache.high=1000
        Integer i3 = new Integer(500);
        Integer i4 = new Integer(500);
        System.out.println("i3 == i4: "+(i3 == i4)); //true

 对于Short Long也有相同的缓存, 默认的也是缓存-128 ~ 127 之间的数值, 但其缓存不可以更改最大值.

 

 

 

封装类对象和基本数据类型==比较, 则会将封装类对象自动转成基本类型后比较,即值比较;

        Integer i4 = new Integer(5000);
        int i5 = 5000;
        System.out.println("i4 == i5: "+(i4 == i5)); //true
原文地址:https://www.cnblogs.com/davidwang/p/2871893.html