Integer a = 128, b = 128;
System.out.println(a == b);
Integer c = 127, d = 127;
System.out.println(c == d);
结果会是什么呢?
是不是和你想的一样呢!咱们看看这是java的什么蜜汁操作
==双方判断的是对象的引用是否相等,那么就是说128双方引用的不是同一个对象,127引用的是同一个,造成这样结果的原因就是缓存,jvm帮我们提前缓存好了一部分Integer,默认最大是127,最小是-128,应该是考虑到这些装箱数据会使用的更频繁,提高性能
Integer a = 127;
上述语句实际内部调用的是Integer的values()进行创建的
Integer a = Integer.valueOf(127);
这里可以看到方法里有一个判断,当需要装箱的值在Cache范围之内的时候,其实返回的是提前准备好的数据了。
总结:默认情况下创建的Integer对象,当其值在-128-127之间时,指向的对象都是同一个。所以平时码代码时为了尽可能地避免这种为了优化而反常的骚操作出现,建议但凡是引用类型的比较都使用equals。
另外:当项目中常用的数值比较大时,可以通过设置jvm启动参数XX:AutoBoxCacheMax调整integer的缓存上限,来降低开销
个人记录 仅供参考 如有错误还请可以不吝赐教