0%

Java 中的 int 和 Integer

总结在使用 Java 的 int 和 Integer 时可能会遇到的一些意想不到的问题。

问题一:整型溢出

int 能表示的整数范围为:-2147483648 ~ 2147483647,超出这个范围就会造成溢出。因此,我们在做常见的加减乘除等运算时会注意这一问题,但是要警惕某些方法也可能造成溢出:

1
System.out.println(Math.abs(-2147483648));  // 输出结果:-2147483648

问题二:自动拆箱导致的空指针错误

以下为简单示例,实际代码中包装类型进行拆箱操作时要考虑为 null 的情况。

1
2
Integer integer = null;
int i = integer;

问题三:Java 虚拟机的常量池会缓存 [-128, 127] 之间的 Integer 对象

如果我们用这个范围内的数给 Integer 对象直接赋值,而不是 new 一个 Integer 对象,则会出现以下结果:

1
2
3
4
5
6
7
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // 输出 true

Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4); // 输出 false

其实是 Java 在编译期间自动装箱,[-128, 127] 以内返回同一个缓存对象。另外,Integer.valueOf() 在这个范围内也会返回缓存对象。

觉得文章有帮助,打赏1元鼓励一下作者