不知你有没有遇到这样的代码,同样是自动装箱,前后结果却不一致。
通过右侧的汇编指令(此处用的是IDEA 的 Bytecode Viewer查看,也可以通过 javap -v 命令得到) ,7-10行的4行代码都执行了 Integer.valueOf() 方法。
通过查看 Integer 源码,发现当 i 也就是发生自动装箱的值在一定范围的时候,直接取的就是缓存里面的值,在范围之外才会重新 new 出一个新的 Integer 对象。
查看 IntegerCache 源码,当第一次使用 IntegerCache 时就会初始化一个Integer数组用来缓存一组对象,这组对象默认表示从 -128到127范围的Integer对象,而且必定包含 -128到127,其上限可以通过 -XX:AutoBoxCacheMax=<size> 启动参数指定。
这样再来看最初的代码就一目了然了,10 已经存在于缓存中,每次取出都是同一个对象,而128不在缓存中,每次都会重新 new 一个新的对象,所以第一个判断是 true,第二个判断是 false。
/* 如有意见或建议,欢迎评论区留言;如发现代码有误,欢迎批评指正 */