总结在使用 Java 的 int 和 Integer 时可能会遇到的一些意想不到的问题。
问题一:整型溢出
int 能表示的整数范围为:-2147483648 ~ 2147483647,超出这个范围就会造成溢出。因此,我们在做常见的加减乘除等运算时会注意这一问题,但是要警惕某些方法也可能造成溢出:
1 | System.out.println(Math.abs(-2147483648)); // 输出结果:-2147483648 |
问题二:自动拆箱导致的空指针错误
以下为简单示例,实际代码中包装类型进行拆箱操作时要考虑为 null 的情况。
1 | Integer integer = null; |
问题三:Java 虚拟机的常量池会缓存 [-128, 127] 之间的 Integer 对象
如果我们用这个范围内的数给 Integer 对象直接赋值,而不是 new 一个 Integer 对象,则会出现以下结果:
1 | Integer i1 = 127; |
其实是 Java 在编译期间自动装箱,[-128, 127] 以内返回同一个缓存对象。另外,Integer.valueOf() 在这个范围内也会返回缓存对象。