Java基础拾遗(一) — 忽略的 Integer 类
学习前我们先看一个笔者之前项目踩过的坑
public static void main(String[] args) { Integer a = 127; Integer b = 127; System.out.println(a==b);//true Integer c = 128; Integer d = 128; System.out.println(c==d); //false }
看到这个结果,有些人可能比较惊讶,我也很惊讶,还中过大招,这都是源码看的不仔细的结果
还是直接上截图:
这是Integer类的源码片段,翻译一下注释:该内部静态类在虚拟机初始化时会设置并保存IntegerCache.high值,默认是127
然后会将-128~127的值缓存下来作为自动装箱时使用(而无需再new出新的Integer对象),笔者当时遇到的问题是:比较两个
Integer的值时因为以前的习惯总是比较int值用==,想着int和Integer会自动拆装箱,所以也会比较值而非对象地址,更要命的是
本地测试的id值一般都不会超过100,结果用==操作符结果总为true,而生产环境的id值是1000+,自然判断为false
接下来再看Integer.valueOf()方法:上源码不用解释,再次遇到IntegerCache
接下来再看Integer类重写的equals方法,可以看到重写后equals比较的对象的内容,也就是比较值大小
接下来看另外一些方法:如果不想用equals方法比较值大小,也可以用intValue()方法作比较
Integer类常用方法比较简单,学习的时候关键是不要遗漏,理解到位,介绍就到这里