问题:127处Java整数常量池行为的分歧
简介:
The整数常量池是Java中的一种机制,可以优化常见整数值的缓存以提高性能。然而,该池的行为在 127 时出现了变化,引起了开发人员的困惑。
理解行为:
对于从 -128 到 127 的整数,Java 保证引用相同常量的变量具有相同的引用。
Integer i1 = 127; Integer i2 = 127; System.out.println(i1 == i2); // True
这是因为这些值被缓存在常量池中。
分歧在128处:
但是当整数值超过127、行为改变。
Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); // False
这是由于实现优化所致。虽然 JLS 保证缓存最多 127 个值,但超出该范围,实现可能会选择以不同方式缓存值,甚至根本不缓存值。
其他注意事项:
甚至在保证范围(-128 到 127)内,缓存行为并不总是可靠。例如,使用 new Integer() 可以绕过常量池并创建新的引用。
Integer i1 = new Integer(127); Integer i2 = new Integer(127); System.out.println(i1 == i2); // False
结论:
整数常量池在 127 处的行为源于实现优化和 JLS 定义的保证范围。开发人员应该意识到这种行为变化,以避免意外结果。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3