Java中的Integer缓存

Java中的Integer缓存

Scroll Down

太长不看版tieba_emotion_92

Java中比较包装类型的变量值时,要使用.equals()方法。除非那几个值是在缓存范围之内的,可以直接用双等于。

Java中的Integer/ˈɪntɪdʒər /,和String,可以说是非常常见了,今天来看一看Integer的一部分源码。String留着下次写。

先从几行比较数值的代码讲起:

        Integer a = 99;
        Integer b = 99;
        Integer c = 180;
        Integer d = 180;
        System.out.println(a == b);
        System.out.println(c == d);

这个打印出来的两个结果分别是 true;false

a,b,c,d 分别是4个Integer类型的对象,而 == 比较的是两个对象的地址是否相同,所以上述结果的意思是a和b竟然指向同一个对象??而c和d是不同的两个对象?

同样是Integer ,为何会有不一样的结果呢?

Java的几个包装类都有自己的.valueOf()方法来初始化变量,让我们点进Integer,看一看它的valueOf()

IntegerCache.low? high?

看来问题出在这玩意上了,点进去可以看到:

原来如此,Java中Integer类型变量的值,如果在-128和127之间,就会从一个已经缓存好了的数组中直接取。

而且这个high可以通过 -Djava.lang.Integer.IntegerCache.high = X进行更改:

然后再次运行,我就得到了两个true。

也可以通过虚拟机参数 -XX:AutoBoxCacheMax = X 来修改这个high 。

为什么缓存这个呢,因为相较于其他的数值,这些数值太常用了,经常 status == 0?吧,经常int i = 0 吧?