四个Integer变量
i1、i2赋值128,System.out.println(i1==i2)输出false
i3、i4赋值127,System.out.println(i3==i4)输出true
不是无意中看到,还真不知道有这机制,果断记一笔。
原则上i1==i2,i3==i4比较的都是其引用的内存地址,应该都是false。
但是,java在java5引入了Integer缓存机制,当开发者使用Integer类型时,如果定义的值在(包含)-128127之间时,会将引用直接指向已创建好的缓存对象。127之间,所以两个变量的引用是指向同一个对象实例(内存地址相同),所以返回true,
i1,i2两个变量在-128
而i3,i4两个变量的值不在-128~127之间,所以jvm分别为这两个自动装箱的对象类型,创建了新的对象实例(内存地址不同),所以返回false。
另外,Integer缓存机制的最大值可以通过jvm参数-XX:AutoBoxCacheMax=size来调整
缓存行为并不仅仅适用于Integer对象,在所有的整型类型类上都有相似的缓存机制。
- ByteCache用于缓存Byte对象
- ShortCache用于缓存Short对象
- LongCache用于缓存Long对象
- CharacterCache用于缓存Character对象
Byte、Short、Long有固定的缓存范围,比如在-128和127(包含)之间的值。
对于Character类,缓存的范围为0到127(包含),除了Integer外,其他类型的缓存范围不能通过启动参数修改。